안드로이드 네트워크/쓰레드 프로그래밍 예제 - 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

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
27 레이아웃이란 무엇일까요? 졸리운_곰 2016.04.30 239
» 안드로이드 네트워크/쓰레드 프로그래밍 예제 - HTTP file 졸리운_곰 2016.04.30 318
25 안드로이드 와이파이 연결시 준비된 코드 실행 졸리운_곰 2016.04.30 423
24 Broadcast Receiver로 문자(SMS) 수신해보자 file 졸리운_곰 2016.04.29 761
23 How do you get the Android's primary e-mail address (or a list of e-mail addresses)? 졸리운_곰 2016.04.29 221
22 안드로이드/Android 액티비티(Activity) 투명 처리 하기 file 졸리운_곰 2016.04.14 196
21 Audio Capture 졸리운_곰 2016.04.08 212
20 [안드로이드] 앱이 파일을 읽고 쓰는 위치 졸리운_곰 2016.03.24 879
19 안드로이드 네트워크 연결 상태 확인 졸리운_곰 2016.03.23 437
18 안드로이드 > 네트워크 연결 상태를 확인하는 ConnectivityManager 졸리운_곰 2016.03.23 652
17 [펌][안드로이드예제] 카메라로 찍은 사진(이미지파일)을 웹서버에 전송하는 프로그램예제 졸리운_곰 2016.03.12 2730
16 안드로이드 통화 녹음 소스 : android call recoder source file 졸리운_곰 2016.03.12 2118
15 안드로이드 앱 : 앱 개발시 코드에서 다른 앱 설치 및 제거 졸리운_곰 2016.03.09 295
14 [Android] 첨부파일 포함한 이메일 보내기 file 졸리운_곰 2016.03.05 911
13 [안드로이드 Android] 시스템 인텐트(Intent)를 이용한 전화걸기, 문자보내기, 이메일보내기 etc file 졸리운_곰 2016.03.05 1101
12 Intent를 사용한 첨부파일 이메일 보내기 file 졸리운_곰 2016.03.05 2117
11 android app gmail 보내기, 안드로이드 E-Mail 보내기 예제 따라하기 file 졸리운_곰 2016.03.05 267
10 android 실행시 class not found 졸리운_곰 2016.03.04 180
9 android 부팅과 함께 app 실행 시키기. 졸리운_곰 2016.03.02 168
8 [Android] 부팅시 서비스(Service) 재실행하기 (항상 실행) 졸리운_곰 2016.03.02 347
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED