25

我的应用程序中有一个 SplashActivity,它在我启动应用程序时使用 AsyncTask 做一些事情。

我还创建了另一个从服务器下载数据的 AsyncTask。现在,在我关闭我的应用程序后,AsyncTask 仍在下载数据。

但是当我再次启动我的应用程序时,我的 SplashActivity 的 AsyncTask 不会执行其后台(doInBackground 函数),直到我的下载器 AsyncTask 完成,并且我的应用程序被挂起。

所以我的问题是我们不能并行运行两个 AsyncTask 吗?两个 AsyncTask 都是不同的并且做自己的事情。有没有办法做到这一点。

4

3 回答 3

47

Honeycomb 版本中的 AsyncTask 发生了变化。旧版本有一个 10 个线程的线程池,因此您可以并行运行 10 个任务。但是对于 Honeycomb 及更高版本,默认是串行执行器,它会一个接一个地执行任务。但是你可以通过一个ThreadPoolExecutor执行:

   if (Build.VERSION.SDK_INT >= 11) {
     //--post GB use serial executor by default --
     task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
   } else {
     //--GB uses ThreadPoolExecutor by default--
     task.execute();
   }
于 2012-12-17T09:07:55.970 回答
37

您将需要使用 athread pool Executor来执行AsyncTask. 默认实现使用在单个线程上运行的串行执行器

所以创建一个ThreadPoolExecutor然后使用

AsyncTask 的executeOnExecutor而不仅仅是执行方法

于 2012-12-17T08:26:28.910 回答
4

另一种选择是使用支持 v.4 库中的AsyncTaskCompat

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() {
    @Override
    protected Object doInBackground(Void... params) {
        // do your parallel task here
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        // and fetch result
    }
});
于 2016-08-05T02:43:00.093 回答