46

AsyncTask 的文档中,它给出了以下与线程相关的规则:

  • 该任务只能执行一次(如果尝试第二次执行将引发异常。)

这意味着每次你想使用它时都必须创建一个新的类实例,对吧?换句话说,必须这样做:

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);

或者相反,您不能执行以下操作:

DownloadFilesTask dfTask = new DownloadFilesTask();
dfTask.execute(url1, url2, url3);
dfTask.execute(url4, url5, url6);

有人可以验证这是一个准确的解释吗?

我意识到我在打字时几乎只是为自己回答了这个问题……但这对我来说并不是很明显,所以我认为尽管如此,发布它还是很有用的。

4

2 回答 2

101

有人可以验证这是一个准确的解释吗?

这是一个非常准确的解释。

于 2010-04-26T11:32:28.843 回答
7

AsyncTasks 还有一个问题。请注意,在示例中

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);

在 Android 3+(API 级别 11,HONEYCOMB)上执行 url1url4 不会并行下载。特别是,如果联系url1将要超时,则传输在url4超时之前甚至不会开始。除非您明确指定,否则所有 AsyncTask 都由同一个工作线程提供服务。

文档说:

执行顺序

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

如果你真的想要并行执行,你可以调用 executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR

于 2013-03-11T11:32:01.040 回答