Android 运行并行异步任务

Android 运行并行异步任务,android,background,android-asynctask,Android,Background,Android Asynctask,我的应用程序中有一个SplashActivity,它在启动应用程序时使用AsyncTask执行一些操作 我还创建了另一个AsyncTask,用于从服务器下载数据。现在,在我关闭应用程序后,AsyncTask仍在下载数据 但当我再次启动应用程序时,我的SplashActivity的AsyncTask不会执行其后台(doInBackground函数),直到我的downloader AsyncTask完成,并且我的应用程序被挂起 所以我的问题是我们不能并行运行两个异步任务?这两个任务是不同的,都在做自

我的应用程序中有一个SplashActivity,它在启动应用程序时使用AsyncTask执行一些操作

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

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

所以我的问题是我们不能并行运行两个异步任务?这两个任务是不同的,都在做自己的事情。
有办法吗。

您需要使用
线程池执行器来执行
异步任务。默认实现使用在单个线程上运行的串行执行器

因此,创建一个


AsyncTask的而不是just execute方法从蜂巢版本开始,AsyncTask发生了变化。旧版本有10个线程的线程池,因此您可以并行运行10个任务。但对于Honeycous和up,默认为串行执行器,它逐个执行任务。但您可以传递一个
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();
   }
另一个选项是使用support v.4库

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
    }
});
AsyncTaskCompat.executeParallel(新的AsyncTask(){
@凌驾
受保护对象doInBackground(无效…参数){
//在这里执行并行任务
返回null;
}
@凌驾
受保护的void onPostExecute(对象结果){
//并获取结果
}
});

请发布相关代码(任务和调用活动),您不需要指定最后一个参数
newvoid[]{}
;省略它就足够了。您的IDE是错误的;vararg是创建数组的快捷方式,因此参数列表当然可以为空。事实上,提供一个像您这样的新阵列实际上是一种不好的做法;您不必要地实例化了一个对象。GC需要过来暂停你的应用几毫秒才能再次清理。谢谢!工作起来很有魅力。Android文档对此再清楚不过了:“公共静态最终执行器线程池执行器。添加在API级别11中-可用于并行执行任务的执行器。”使用此方法是否存在某种缺陷。例如,通过使AsyncTask并行,您是否必须做一些额外的工作?@Gee.e使用默认执行器更好,因为只有一个线程被实例化,因此如果您没有太多的任务同时运行,默认执行器提供更好的性能,但是如果有一个AsyncTask需要大量时间,你可能需要一个ThreadPoolExecutor@nandeesh罗杰,我正在使用并行任务从缓存的数据库中获取数据。出于复杂的原因,我需要fetcher任务并行运行,但由于所花费的时间可以忽略不计,所以我看不到任何性能下降。无论如何,感谢您解释这个问题。必须注意的是,executeOnExecuter将创建数据竞争,因此您需要小心。该类在API级别26中被弃用,在API级别27中被删除