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)上执行url1
和url4
不会并行下载。 特别是,如果联系url1
将超时, url4
的转移将不会启动,直到它超时。 除非另有明确规定,否则所有AsyncTasks都由相同的单个工作线程提供服务。
文档说:
执行顺序
首次引入时,AsyncTasks在单个后台线程上被串行执行。 从DONUT开始,将其更改为允许多个任务并行操作的线程池。 从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。
如果真的需要并行执行,可以使用 THREAD_POOL_EXECUTOR
调用executeOnExecutor(java.util.concurrent.Executor,Object []) 。