AsyncTask 线程规则 - 真的只能使用一次吗?
Posted
技术标签:
【中文标题】AsyncTask 线程规则 - 真的只能使用一次吗?【英文标题】:AsyncTask Threading Rule - Can it really only be used once? 【发布时间】:2011-02-12 06:17:21 【问题描述】:在documentation on 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);
有人可以验证这是一个准确的解释吗?
我意识到我在打字时几乎只是为自己回答了这个问题……但这对我来说并不是很明显,所以我认为尽管如此,发布它还是很有用的。
【问题讨论】:
【参考方案1】:有人可以验证这是准确的吗 解释?
这是一个非常准确的解释。
【讨论】:
阅读旧的 SO 问题,我发现这个答案非常有趣。我笑了,笑了很多。【参考方案2】:AsyncTasks 还有一个问题。 请注意,在示例中
new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);
在 android 3+ 上执行(API 级别 11,HONEYCOMB)
url1
和 url4
不会并行下载。
特别是,如果联系url1
将超时,则url4
上的传输甚至在超时之前都不会开始。除非您另外明确指定,否则所有 AsyncTask 都由同一个工作线程提供服务。
文档说:
执行顺序
首次引入时,AsyncTask 是在单个后台线程上串行执行的。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。
如果你真的想要并行执行,你可以调用 executeOnExecutor(java.util.concurrent.Executor, Object[]) 与 THREAD_POOL_EXECUTOR
。
【讨论】:
但是,请注意,问题是完全不同的——是否可以重用 AsyncTask 的实例。以上是关于AsyncTask 线程规则 - 真的只能使用一次吗?的主要内容,如果未能解决你的问题,请参考以下文章