AsyncTask线程规则 - 它真的只能使用一次吗?

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);

有人能验证这是否是准确的解释吗?

我认识到我在打字时几乎已经回答了自己的问题......但对我来说并不是显而易见的,所以我认为将其发布仍然会有用。

2个回答

101
有人能够验证这是否是准确的解释吗?
那是非常准确的解释。

3
阅读旧的 Stack Overflow (SO) 问题时,我发现了这个极其有趣的答案。我笑了很多,真是开心。 - davidcesarino

7

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

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

在Android 3+ (API level 11, HONEYCOMB)上执行的时候,url1url4不会并行下载。特别是,如果连接url1超时,则url4的传输直到超时才开始。除非您明确指定,否则所有AsyncTasks都由同一个单线程工作线程提供服务。

文档中说:

执行顺序

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

如果您真正希望并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object[])


1
然而,需要注意的是问题完全不同——即AsyncTask的实例是否可以被重复使用。 - Vit Khudenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接