asynctask是不是用主线程运行parellel

时间:2015-11-18 03:36:54

标签: android multithreading android-asynctask

我读了一篇关于asynctask here的帖子 说要在主线程的parellel中执行它,请使用此类的executeOnExecutor方法。我认为asynctask已经在parellel中运行了。 有人可以帮我解释一下吗?

2 个答案:

答案 0 :(得分:0)

感谢@Rookie和@Nashe

据我所知,AsyncTask可以串行和并行运行。当AsyncTask串行运行时,每个任务都依次执行,即。假设您使用AsyncTask来解码文件中的图像,并且您想要为列表视图解码多个图像。然后你需要在适配器的getView()上执行多个AsyncTask,并且每个AsyncTask都是串行执行的,即。一个接一个地。

但是,由于较新的设备具有多个物理内核,因此这些设备可以同时执行多个线程。在这种情况下,每个AsyncTask都可以相互并行运行。

但是你无法预测这些线程中的哪一个将首先完成。即。您的第5行listview可能已在第一行之前完成解码图像。

所以AsyncTask.executeOnExecutor()(自API 11开始)允许你并行执行AsyncTask而AsyncTask.execute()允许你串行执行AsyncTask

我希望它可以帮助你......

答案 1 :(得分:0)

首先,您应该了解我们将使用executeOnExecutor方法的位置, AsyncTask可以正确,方便地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。

如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。 例如,如果你想在那时同时播放歌曲并下载文件,你必须使用asynctask并行执行(ASYNCTASK.THREAD_POOL_EXECUTOR)