Thread
안드로이드 앱의 Main thread를 UI thread라고도 부른다. network 통신을 하려면 UI thread에서는 불가능하며, 새로운 thread를 이용해야한다. 그 이유는 다음과 같은 룰이 있기 때문이다.
Rules
Do not block the UI thread
The UI toolkit must be accessed by the UI thread
다음과 같은 Long operation은 별도의 thread에서 실행하는 것이 좋다.
Network
Database
File I/O
오랜 시간이 걸리는 계산
따라서 만약 타 thread에서 UI를 수정해야 할 일이 생긴다면 Event Queue를 이용해야한다.

이를 위해 runOnUiThread를 활용 할 수 있다. 이는 현재 스레드가 UI 스레드라면 UI 자원을 사용하는 행동에 대해서는 즉시 실행된다는 것이고, 만약 현재 스레드가 UI 스레드가 아니라면 행동은 UI 스레드의 자원 사용 이벤트 큐에 들어가게 되는 것이다.

아래와 같은 방식으로 사용한다.
new Thread(new Runnable() {
public void run() {
final Bitmap bitmap = loadImageFromNetwork("http://www.naver.com/naver.gif");
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
}).start();
또한 View.post()와 View.postDelayed()를 사용할 수 있는데, 이는 원리는 같지만 해당 View가 윈도우에 있는 상태에서만 가능하다. postDelayed()는 원하는 요청이 지정된 시간 후에 Event Queue에 들어가게 된다.
new Thread(new Runnable() {
public void run() {
final Bitmap bitmap = loadImageFromNetwork("http://www.naver.com/naver.gif");
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
}).start();
new Thread(new Runnable() {
public void run() {
final Bitmap bitmap = loadImageFromNetwork("http://www.naver.com/naver.gif");
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
}, 1000);
}
}).start();
AsyncTask
타 thread가 Main thread에게 지속적으로 메세지를 보내, UI가 refresh될 수 있도록 한다. 네트워크상에서 다운받는 진행 바를 표기하는 용도로 사용될 수 있다.

public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
/** The system calls this to perform work in a worker thread and
* delivers it the parameters given to AsyncTask.execute()
*/
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** The system calls this to perform work in the UI thread and delivers
* the result from doInBackground()
*/
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
UI 변경을 위해 핸들러 사용은 지양해야 한다.