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

sto*_*986 46 android android-asynctask

AsyncTask文档中,它提供了以下与线程相关的规则:

  • 该任务只能执行一次(如果尝试第二次执行,则会抛出异常.)

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

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);
Run Code Online (Sandbox Code Playgroud)

或者相反,您不能执行以下操作:

DownloadFilesTask dfTask = new DownloadFilesTask();
dfTask.execute(url1, url2, url3);
dfTask.execute(url4, url5, url6);
Run Code Online (Sandbox Code Playgroud)

有人可以验证这是一个准确的解释吗?

我知道自己刚刚给自己解答了这个问题,因为我正在输入这个......但是对我来说并不是很明显,所以我认为尽管如此,这仍然很有用.

Com*_*are 101

有人可以验证这是一个准确的解释吗?

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

  • 最好的答案. (39认同)
  • 阅读旧的SO问题,我发现这个非常有趣的答案.我笑了,这是很多. (3认同)

184*_*615 7

AsyncTasks还有一个问题.请注意,在示例中

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);
Run Code Online (Sandbox Code Playgroud)

在Android 3+(API级别11,HONEYCOMB)上执行 url1,url4 不会并行下载.特别是,如果接触url1超时,转移url4开启直到超时为止.除非您明确指定,否则所有AsyncTasks都由相同的单个工作线程提供服务.

文档说:

执行顺序

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

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