Android AsyncTask.THREAD_POOL_EXECUTOR与使用Runnables的自定义ThreadPool

时间:2014-06-25 16:29:13

标签: java android multithreading android-asynctask threadpool

我需要在Android上同时处理一些任务,我想使用某种线程池来执行此操作。我在文档中找不到在使用AsyncTask.THREAD_POOL_EXECUTOR执行AsyncTask时“幕后”实际发生的情况。

我的问题是:与AsyncTask.THREAD_POOL_EXECUTOR一起使用AsyncTasks而不是使用Runnables实现自定义ThreadPool,我会失去什么? (让我们谈谈后蜂窝)。

我意识到这个问题相当普遍,但我对并行编程相当新(除了AsyncTask本身)。我不是在寻找并发编程的教程!我只是想了解Android特定的AsyncTask.THREAD_POOL_EXECUTOR是如何不同的。我认为解释将有助于将来的其他人,因为他们权衡选择使用AsyncTask vs Thread / Runnable的利弊。提前谢谢!

2 个答案:

答案 0 :(得分:2)

AsyncTasks为您提供了在执行工作任务之前和之后在UI线程上执行操作的可能性。因此,如果您不需要与UI通信,那么请使用您自己的执行程序 - 您始终可以使用处理程序实现此功能。自api 11以来,AsyncTasks正在连续执行,因为并行执行被认为难以正确实现。

如果你需要更多的灵活性,那么执行器是一种可行的方法,它们将允许你自由地指定并行执行的任务数,排队等数量。

如果您对细节感兴趣,可以随时查看来源:

http://androidxref.com/4.4.3_r1.1/xref/development/samples/training/bitmapfun/BitmapFun/src/main/java/com/example/android/bitmapfun/util/AsyncTask.java

答案 1 :(得分:0)

非UI工作可能包括AsyncTasks,HandlerThreads,IntentServices等。

建议AsyncTasks用于与UI相关的工作(影响UI的工作)的原因是AsyncTask具有帮助程序回调,允许您将控件传输到UI线程。

但是,没有建议更长时间运行的操作,因为默认情况下,它使用全局执行程序,这可能导致应用程序全局等待线程在执行长时间运行操作时停止。因此,您可以切换到自定义执行程序并摆脱全局影响。

在一天结束时,HandlerThreads再次成为线程,它使Looper保持线程活动。执行仍然是连续执行的,那么使用它们的真正原因是什么?我相信这是执行像Executors这样的Runnables的能力,但更多的是轻量级的。

IntentServices再次 - 连续执行任务的方式,但你有更多的权力和隔离,因为它们完全不同的组件具有独立的生命周期。它们会自动销毁,因此您不必担心会破坏它们以降低应用程序进程的优先级(关闭主题但会导致一些内存性能问题,无用等)。