2015-11-18 36 views
2

我读了一篇关于asynctask here 的帖子,表示在与主线程使用此类的executeOnExecutor方法的parellel中执行它。我认为asynctask已经在parellel跑。 有人可以为我解释这个吗?asynctask没有与主线程运行parellel

+0

参见:http://stackoverflow.com/a/24788257/295004 –

回答

0

感谢@Rookie和@Nashe

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

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

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

所以AsyncTask.executeOnExecutor()(因为API 11),让你在并行和AsyncTask.execute()执行的AsyncTask让你执行的AsyncTask连续

我希望它可以帮助你..

+0

根据到Morrison Chang共享的链接,它说api 11 asynctask连续运行后,默认情况下是在甜甜圈后进行的。因此,API 11之前的语句AsyncTask连续运行并不正确。但是,这让我对混乱有了很好的认识。 thnx – Rookie

+0

谢谢你的更正。我会更新我的回答 –

0

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

第一次引入时,AsyncTasks在单个后台线程上被串行执行。从DONUT开始,将其更改为允许多个任务并行操作的线程池。从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。 例如,如果你要玩一首歌,当时同时下载一个文件,你必须使用的AsyncTask并行执行(ASYNCTASK.THREAD_POOL_EXECUTOR)

+0

感谢您的回答。但是我有一个疑问,因为当我演奏一首歌曲时,我将使用seprate asynctask,在下载文件时我会使用另一个。这两个不会在单独的线程中运行吗? – Rookie

+0

一个线程池可以运行一个任务的多个并行实例http://codetheory.in/android-java-executor-framework/ – skyshine

+0

它肯定会做,但我的问题是当我在两个不同的asynctasks上执行两个不同的任务时,我需要在parellel中执行它们,否则它们本身将运行在parellel中。我的理解是,当我们使用相同的asynctask实现时,我们需要让它运行parellel,因为在跳转到另一个之前,相同的异步实现等待完成一个任务。但是,当我们使用不同的asynctasks时,不需要让它们运行不同,因为它们不同,它们肯定会在不同的asynctasks实例中运行。纠正我,如果我错了。@suresh – Rookie