2011-07-02 20 views
12

我的應用程序使用一個Service做一些後臺的東西。我正在使用服務中的其他線程來執行一些計算。爲此,我每5到10秒創建兩個線程,運行5到10秒。但我不知道我應該使用哪種線程模型:安卓的AsyncTask或普通Java線程使用的ExecutorService

  1. 的AsyncTask:

    優點:

    • 使用方便
    • Android的具體
    • 容易UI交互

    缺點:

    • 因爲我必須使用API​​ 10級,沒有ExecutorService與固定的線程池來執行AsyncTasks
  2. 普通Java線程:

    優點:

    • ExecutorService的固定線程池

    缺點:

    • 不容易處理,例如, UI交互

哪種模式是更好地使用?特別關注表現。當我使用AsyncTasks時,是否有很大的開銷,並且ExecutorService在創建新的AsyncTasks時重用線程比使用Android更快?

回答

12

如果你看看AsyncTask實施,你會看到它使用使用「普通Java線程」自己的線程池。

當我使用AsyncTasks時,是否有很大的開銷,並且ExecutorService在創建新的AsyncTasks時比使用線程更快地重複使用線程?

應該有兩個之間沒有實質性的區別。

+0

這是正確的,謝謝! – Tobias

1

我正在使用針頭;一個開源的,簡單而強大的Android多線程庫。有了它,你可以說這樣的話:

Needle.onMainThread().execute(new Runnable() { 
    @Override 
    public void run() { 
     // e.g. change one of the views 
    } 
}); 

Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() { 
    @Override 
    protected Integer doWork() { 
     int result = 1+2; 
     return result; 
    } 

    @Override 
    protected void thenDoUiRelatedWork(Integer result) { 
     mSomeTextView.setText("result: " + result); 
    } 
}); 

優點

  • 非常簡單的API
  • 固定的線程池大小
  • 定製的線程池的大小
  • 支持UI交互(「d Ø工作,然後用在UI線程「)結果
  • Android 1.5以上版本
  • 相同的行爲在所有平臺版本

缺點

  • 額外庫的依賴

檢查它在GitHub上:https://github.com/ZsoltSafrany/needle

+1

這看起來很有希望。請試試我的下一個項目。 – Tiago