在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);
有人可以证实这是一个准确的解释吗?
我意识到我正在为自己解答这个问题,因为我正在输入这个......但这对我来说并不是很明显,所以我认为尽管如此,这仍然很有用。
答案 0 :(得分:101)
有人可以证实这是准确的 解释
这是一个非常准确的解释。
答案 1 :(得分:7)
AsyncTasks还有一个问题。 请注意,在示例中
new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);
在Android 3+上执行(API级别11,HONEYCOMB)
url1
和url4
不会 并行下载。
特别是,如果联系url1
即将超时,url4
上的转移甚至会在超时之前启动。除非您明确指定,否则所有AsyncTasks都由相同的单个工作线程提供服务。
文档说:
执行顺序
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用 THREAD_POOL_EXECUTOR
调用executeOnExecutor(java.util.concurrent.Executor,Object [])。