好的,所以我有一个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将等到它们运行之前完成。 谢谢你能给我的任何帮助。
答案 0 :(得分:2)
使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
代替execute()
。引用the AsyncTask
documentation:
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。