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

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
53 레이아웃이란 무엇일까요? 졸리운_곰 2016.04.30 238
» 안드로이드 네트워크/쓰레드 프로그래밍 예제 - HTTP file 졸리운_곰 2016.04.30 318
51 안드로이드 와이파이 연결시 준비된 코드 실행2 졸리운_곰 2016.04.30 171
50 안드로이드 와이파이 연결시 준비된 코드 실행 졸리운_곰 2016.04.30 423
49 Worked solution for Kivy + Admob on android 졸리운_곰 2016.04.30 580
48 Broadcast Receiver로 문자(SMS) 수신해보자 file 졸리운_곰 2016.04.29 761
47 How do you get the Android's primary e-mail address (or a list of e-mail addresses)? 졸리운_곰 2016.04.29 221
46 지니모션 설치 방법 총정리 (한글키보드 + 구글플레이 설치) file 졸리운_곰 2016.04.23 1065
45 넥서스5 USB to PC 연결 뒤 아무것도 안 보인다면 file 졸리운_곰 2016.04.18 732
44 워드프레스와 모바일웹, 앱 file 졸리운_곰 2016.04.17 191
43 워드프레스 기반 안드로이드 앱 만들기 file 졸리운_곰 2016.04.17 522
42 안드로이드/Android 액티비티(Activity) 투명 처리 하기 file 졸리운_곰 2016.04.14 196
41 Audio Capture 졸리운_곰 2016.04.08 212
40 [안드로이드] 앱이 파일을 읽고 쓰는 위치 졸리운_곰 2016.03.24 879
39 안드로이드 네트워크 연결 상태 확인 졸리운_곰 2016.03.23 437
38 안드로이드 > 네트워크 연결 상태를 확인하는 ConnectivityManager 졸리운_곰 2016.03.23 652
37 [펌][안드로이드예제] 카메라로 찍은 사진(이미지파일)을 웹서버에 전송하는 프로그램예제 졸리운_곰 2016.03.12 2730
36 안드로이드 통화 녹음 소스 : android call recoder source file 졸리운_곰 2016.03.12 2118
35 안드로이드 앱 : 앱 개발시 코드에서 다른 앱 설치 및 제거 졸리운_곰 2016.03.09 295
34 [Android] 첨부파일 포함한 이메일 보내기 file 졸리운_곰 2016.03.05 911
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED