Thread

     

    UI Thread (Main thread)

    Application이 시작될 때 UI Thread 생성됨

    시스템 or 사용자와의 상호작용으로 발생되는 모든 이벤트를 UI Toolkit 에게 전달

    사용자 Touch -> UI thread -> Button Nomal(상태 변화) -> Button Pressed(상태 변화) -> UI thread -> Button의 onDraw()

    오랜 시간이 걸리는 작업은 별도의 Thread에서 이루어져야 함

    네트워크 작업 등의 작업을 할 때 화면이 멈춰 있음

    안드로이 UI Tookit 요소(버튼, 체크 박스 등)은 Thread-safe 하지 않기 때문에 UI Thread에서만 변경되어야 함

    방법들

    Activity.runOnUiThread(Runnable)

    View.post(Runnable)

    View.postDelayed(Runnable, long)

    Handler

    이러한 방법은 코드를 복잡하고 이해를 어렵게 만듬.

    AsyncTask

    오랜 기간 유지되며, 사용자 인터페이스와 상호작용할 수 있는 Task를 손쉽게 만들어줌

    개발자를 대신하여 Woker Thread를 관리

    반드시 UI Thread에서 실행되어야 하고, 한 번만 실행될 수 있음.

     

     

    public void onClick(View v) {

      new Thread(new Runnable() {

        public void run() {

          final Bitmap b = loadImageFromNetwork();

          mImageView.post(new Runnable() {

            public void run() {

              mImageView.setImageBitmap(b);

            }

          });

        }

      }).start();

     

     public void onClick(View v) {

      new DownloadImageTask().execute("http://example.com/image.png");

    }


    private class DownloadImageTask extends AsyncTask<string, void,="" bitmap=""> {

         protected Bitmap doInBackground(String... urls) {

             return loadImageFromNetwork(urls[0]);

         }


         protected void onPostExecute(Bitmap result) {

             mImageView.setImageBitmap(result);

         }

     }

     

    - Generics를 사용해 Parameter, Progress 정보, 결과 값의 자료형을 임의로 정의해서 사용 가능.

    - doInBackground()는 UI Thread가 아닌 별도의 Thread에서 자동 실행됨

    - 반면에 onPreExecute, onPostExecute 그리고 on ProgressUpdate 는 UI Thread에서 호출됨

    - doInBackground()의 결과 값은 onPostExcute로 전달됨

    - doInBackground() 함수 내에서 publishProgress()를 호출 가능

    - 어떠한 Thread에서도 항상 AsyncTast 작업을 취소 가능

     

    'Android > Theory' 카테고리의 다른 글

    Android 개발 10 계명  (0) 2013.04.17
    Memory  (0) 2013.04.17
    Window  (0) 2013.04.16
    Toast  (0) 2013.04.16
    Service  (0) 2013.04.16

    댓글