2011-07-02 21 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