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

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

  • 该任务只能执行一次(如果尝试执行第二次执行,则会引发exception)。

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

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

有人可以validation这是一个准确的解释?

我意识到自己在回答这个问题的时候自己也是这么回答的……但是这对我来说并不是很明显,所以我认为这样做对我们来说是有用的。

有人可以validation这是一个准确的解释?

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

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 [])