본 글은 그냥 본인이 블로그를 찾아 헤매며 두 방식의 차이점이 당췌 무엇인가?
궁금해서 요약해 본 것입니다.

1. 안드로이드에서의 멀티테스킹

안드로이드는 Thread & Handler / AsyncTask 를 통해서 멀티테스킹을 구현할 수 있습니다

특히나 UI 쓰레드는 항상 최상위의 잡혀 있기 때문에 일반적으로 Thread 만으로는 UI 영역에 접근할 수 없습니다.

그래서 나온 방식이 Thread 와 Handler 를 이용한 방식입니다

 
private void refreshStockData(){
final ArrayList<Stock> localStocks =
new ArrayList<Stock>(stocks.size());
for (Stock stock : stocks){
localStocks.add(new Stock(stock, stock.getId()));
}
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
for (int i=0;i<stocks.size();i++){
stocks.set(i, localStocks.get(i));
}
refresh();
}
};
Runnable task = new Runnable(){
public void run() {
try {
ArrayList<Stock> newStocks =
fetchStockData(localStocks.toArray(
new Stock[localStocks.size()]));
for (int i=0;i<localStocks.size();i++){
Stock ns = newStocks.get(i);
Stock ls = localStocks.get(i);
ls.setName(ns.getName());
ls.setCurrentPrice(ns.getCurrentPrice());
}
handler.sendEmptyMessage(RESULT_OK);
} catch (Exception e) {
Log.e("StockPortfolioViewStocks",
"Exception getting stock data", e);
}
}
};
Thread dataThread = new Thread(task);
dataThread.start();
}

위의 코드는 한 멤버의 리스트에 대해서 Handler 와 Thread 를 이용해서 구현한 멀티쓰레딩입니다.

소스가 매우 복잡하죠?

그래서 나온 방식이 아래의 방식입니다

 
private void refreshStockData() {
new AsyncTask<Stock, Void, ArrayList<Stock>>(){
@Override
protected void onPostExecute(ArrayList<Stock> result) {
ViewStocks.this.stocks = result;
refresh();
}

@Override
protected ArrayList<Stock> doInBackground(Stock... stocks){
try {
return fetchStockData(stocks);
} catch (Exception e) {
Log.e("StockPortfolioViewStocks", "Exception getting stock data", e);
}
return null;
}
}.execute(stocks.toArray(new Stock[stocks.size()]));
}

그 많은 소스가 AsyncTask 를 통해서 줄여 줄 수 있게 되었습니다.

AsyncTask 는 Handler 에서 사용된 코드들의 많은 부분을 캡슐화 하면서 가독성을 높여주게 되었습니다

하지만...AsyncTask 에도 치명적인 단점이 있습니다.

제가 알아본 가장 큰 문제점은 AsyncTask 를 구현한 액티비티를 종료하였을 때에 별도의 지시가 없다면 AsyncTask 는 종료되지 않고 계속적으로 구현된다는 것입니다.
게다가 종료되지 않은 AsyncTask 가 구동 중 똑같은 AsyncTask 를 실행하게 되면 충돌이 일어나게 된다는 것이죠.

그래서 한 블로거가 이를 개선할 방법을 API로 만들어 배포하고 있습니다.

기본적인 개념은 아래와 같습니다.
 

Life-cycle helpers

these methods let you conditionally perform work depending on a context’s life-cycle state.

  • isLaunching() is true if and only if the context just went through onCreate() for the first time (but was not restored, i.e. onRestoreInstanceState() was not called)
  • isRestoring() is true if your context is recovering after being killed by Android
  • isResuming() is true if your context is “soft-resuming” as I call it, i.e. there was no call to onCreate() before going through onResume()
  • isApplicationBroughtToBackground(): sometimes it’s necessary to distinguish between your activity being paused by another activity of your own application, or by an entirely different application. This method yields true if another application’s activity is hiding yours.

라이프사이클을 구분할 수 있는 함수를 만들어서 AsyncTask 의 문제점을 개선하였다는 것입니다.

----------------------------------------------------------------------

그냥 제가 궁금했던것을 구글링하다가 한번 남겨보네요

참조사이트
http://www.ibm.com/developerworks/kr/library/x-gourmetandroid/index.html
(안드로이드 멀티쓰레드에 대한 설명)
http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/
(AsyncTask 의 문제개선 소스 설명 및 배포)