병홍 2013. 4. 17. 14:17

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 작업을 취소 가능