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"); }
protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); }
mImageView.setImageBitmap(result); } } |
- Generics를 사용해 Parameter, Progress 정보, 결과 값의 자료형을 임의로 정의해서 사용 가능.
- doInBackground()는 UI Thread가 아닌 별도의 Thread에서 자동 실행됨
- 반면에 onPreExecute, onPostExecute 그리고 on ProgressUpdate 는 UI Thread에서 호출됨
- doInBackground()의 결과 값은 onPostExcute로 전달됨
- doInBackground() 함수 내에서 publishProgress()를 호출 가능
- 어떠한 Thread에서도 항상 AsyncTast 작업을 취소 가능
댓글