안드로이드 네트워크/쓰레드 프로그래밍 예제 - HTTP

http://killins.egloos.com/3007399

  - 안드로이드 네트워크/쓰레드 프로그래밍이라해서 특별한 것은 없다. 일반적인 자바 네트웍/쓰레드 프로그래밍과 동일

  - 안드로이드에서 기본적으로 제공하는 HTTP 클라이언트에는 HttpURLConnection과 아파치 HttpClient가 있다.
    둘 모두 https 지원, 스트리밍 업/다운로드, IPv6, 커넥션 풀링 등을 지원하는 등 매우 유사하지만,
    HttpURLConnection이 좀 더 가볍기 때문에 진저브레드 이상의 안드로이드에서는 이것을 사용할것을 권하고 있다.
    (http://android-developers.blogspot.kr/2011/09/androids-http-clients.html 참고)

  - 프로요 이전의 안드로이드에서 HttpURLConnection을 사용할 경우 readable input stream에서 close()를 호출하면 전체 connection pool에 쓰레기값이 들어갈 수도 있는 현상이 발생하므로, 아래와 같이 connection pooling을 off 해주어야한다.
    if (Integer.parseInt(Build.VERSION_SDK) < Build.VERSION_CODES.FROYO) {
         System.setProperty("http.keepAlive", "false");
    }


  - 안드로이드에서 제공하는 쓰레드 클래스에는 AsyncTask가 있다. 사용할 쓰레드 클래스는 이것을 extends 해서 선언하도록하며 아래의 메소드들을 override하여 사용하게 된다.
    onPreExecute() : 쓰레드가 실행되기 이전에 실행되는 메소드
    doInBackground(Params... params) : 쓰레드로 실행할 부분
    onProgressUpdate(Progress... values) : publishProgress(Progress... values) 메소드에 의해 invoke된다. 아무때나 콜 가능
    onPostExecute(Result result) : 쓰레드가 완료되면 실행되는 메소드.
  AsyncTask는 generic이기 때문에 extends 시 3개의 generic type을 붙여주게 되는데, 첫번째가 doInBackground() 에서 사용할 Params, 두번째가 onProgressUpdate()에서 사용할 Progress, 세번째가 onPostExecute()에서 사용할 Result의 type이다.

  -  주소를 입력하는 간단한 EditText와 html을 표시할 TextView, 그리고 다운로드를 수행할 Button으로 구성된 레이아웃이 있다는 전제하에 HttpURLConnection을 사용하는 html 다운로드 http 클라이언트 예제 프로그램을 작성. html을 다운로드 하는 부분을 별도의 쓰레드로 구현.

 

  - 진저브레드 이상의 안드로이드에서는 메인 쓰레드에서 네트워크 호출을 하면 무조건 에러가 된다. 쓰레드를 별도 기동할 것.

 


1. 네트워크 접근 퍼미션 획득

  - 앱에서 네트워크에 접속하기 위해서는 기본적으로 시스템으로부터 권한을 획득해야한다.
  - manifest 파일에 아래 element를 추가

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


2. 레이아웃과 액티비티를 연결

  - 액티비티 클래스를 하나 생성하여 이미 작성된 레이아웃 및 레이아웃의 각 뷰들을 적당한 멤버변수에 연결해준다.

    super.onCreate(savedInstanceState);
    setContentView(R.layout.http_main);

    Button downloadButton;
    mEditText = (EditText)findViewById(R.id.myUrl);
    mTextView = (TextView)findViewById(R.id.myText);
    downloadButton = (Button)findViewById(R.id.download);


  - 레이아웃의 버튼이 클릭되었을 때 실행할 리스너를 선언하고 콜백 함수를 injection 해준다.

    downloadButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    });


3. 네트워크 연결상태 확인 및 쓰레드 기동

  - 버튼이 클릭되면 해당 주소로 접근하기 전에 우선 네트워크에 접근 가능한지부터 확인한다. 안드로이드에서 제공하는 ConnectivityManagerNetworkInfo를 이용해서 네트워크 상태를 얻어올 수 있다.
  - ConnectivityManager : 네트워크 연결 상태를 얻기 위한 클래스
    Context.getSystemService(Context.CONNECTIVITY_SERVICE)로 오브젝트를 얻어온다. 역할은 아래와 같다
    1) 네트워크 연결상태 모니터링
    2) 네트워크 연결상태가 변경되었을때 intent를 broadcast
    3) 현재 네트워크 연결을 잃었을 때 다른 네트워크로 fail over
    4) 사용가능한 네트워크 상태를 조회하는 API 제공
  - NetworkInfo : 인자로 주어진 네트워크 인터페이스(WiFi, mobile 등)의 연결상태를 얻기 위한 클래스
  - 네트워크 상태가 정상이면 쓰레드를 기동한다. (쓰레드 작성은 아래쪽에)

   @Override
   public void onClick(View v) {
      String strUrl = mEditText.getText().toString();
      try {
         if (strUrl != null && strUrl.length() > 0) {
           ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
           NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
           if (netInfo != null && netInfo.isConnected()) {
                  new DownloadWebpageText().execute(strUrl);        // html 다운로드 쓰레드 기동
           } else {
               throw new Exception(getString(R.string.network_error));
           }
        } else {
           throw new Exception(getString(R.string.bad_url));
        }
      } catch (Exception e) {
          mTextView.setText(e.getMessage());
      }
   }


4. html 다운로드를 수행할 쓰레드 작성

  - html 다운로드를 수행할 쓰레드를 생성한다.
  - AsyncTask를 extends해서 DownloadWebpageText 클래스를 만든다. 쓰레드는 URL을 입력받아 웹에 접근하고, 결과로 다운로드한 html을 넘겨주어야 하므로 generic type은 String으로 한다.
  - 쓰레드가 종료되면 바로 TextView에 html을 뿌려준다.
  - 다운로드하는 방식은 URL을 InputStream으로 연결하고 InputStreamReader로 500바이트만 읽어오는 방식으로 한다. 

   private class DownloadWebpageText extends AsyncTask<String,String,String> {

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

      @Override
      protected String doInBackground(String... arg0) {
         try {
            return (String)downloadUrl((String)arg0[0]);
         } catch (IOException e) {
             Log.d(DEBUG_TAG, "The msg is : " + e.getMessage());
             return "download failed";
         }
      }
      protected void onPostExecute(String result) {
         mTextView.setText(result);
       }
       private String downloadUrl(String strUrl) throws IOException {
           InputStream is = null;
           Reader reader = null;
           int len = 500;

           try {
              URL url = new URL(strUrl);
              HttpURLConnection conn = (HttpURLConnection) url.openConnection();
              conn.setReadTimeout(5000);
              conn.setConnectTimeout(5000);
              conn.setRequestMethod("GET");
              conn.setDoInput(true);
              conn.connect();
              int resp = conn.getResponseCode();
              Log.d(DEBUG_TAG, "The response is: " +resp);
              is = conn.getInputStream();
              reader = new InputStreamReader(is, "UTF-8");
              char[] buff = new char[len];
              reader.read(buff);
              return new String(buff);
           }
           finally {
               if (is != null) {
               is.close();
           }
         }
      }
   }



* 출처 : http://developer.android.com/training/basics/network-ops/connecting.html

* 소스파일 : HttpExample.zip HttpExample.zip HttpExample.zip

 

[출처] http://egloos.zum.com/killins/v/3007399

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
1 ART(Android Runtime) file 졸리운_곰 2015.08.05 343
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED