如何同时运行多个Android AsyncTask?

时间:2015-09-17 17:42:38

标签: java android multithreading listview android-asynctask

好的,所以我有一个Android应用程序,它对主要活动上加载的片段有一个列表视图。列表视图包含一个imageview,它通过适配器从设备外部存储器加载图像,该适配器又调用名为BackgroundImageLoader的AsyncTask对象。 在这一点上,如果我运行我的应用程序一切都很好,图像几乎瞬间显示。 提供有关该过程的更多细节.... 在listview的适配器的bindView方法中,我调用一个调用以下内容的方法:

BackgroundImageLoader loader = new BackgroundImageLoader(photoID, imageView); 
loader.execute();

现在我完成上述代码后,我写了一些逻辑来“清除旧照片”。此逻辑放在名为AutoPurgePhotos_Task的AsyncTask对象中。基本上我想在启动应用程序时运行一次任务,但我只是希望它在后台运行,以免干扰UI。我尝试从Applications onCreate()方法的尾端启动它,我尝试从MainActivity的onCreate()方法启动它。结果是清除逻辑运行并且完美地运行。虽然它在后台运行,但我的UI似乎也在使用除了BackgroundImageLoader AsyncTask之外的一切。在AutoPurge任务完成之前,所有照片都不会开始显示。即使为了证明它与我在任务中所做的事情无关,我评论了我的所有业务逻辑,只是让任务陷入困境。

public class AutoPurgePhotos_Task  extends AsyncTask<Void, Void, Void> {

public AutoPurgePhotos_Task() {
    super();
}

@Override
protected Void doInBackground(Void... params) {

    SystemClock.sleep(10000);
    return null ;
}
}

作为旁注,我的应用中还有其他asynctask,直到这个初始asynctask结束才会运行。它好像一次只能运行一个asynctask。同样,我的UI线程中的所有其他代码似乎正在运行,并且在asynctask运行时工作正常。看起来一次只能运行一个asynctask。

以下是我启动autopurge任务的方法......

AutoPurgePhotos_Task task = new AutoPurgePhotos_Task();
task.execute();

我再次尝试从几个不同的区域启动它,无论我在何处/如何启动它,另一个asynctask将等到它们运行之前完成。 谢谢你能给我的任何帮助。

1 个答案:

答案 0 :(得分:2)

使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)代替execute()。引用the AsyncTask documentation

  

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