Android线程(AsyncTasks)表现得有点怪异

时间:2014-08-26 23:43:12

标签: android multithreading android-asynctask

从我的主线程开始,我启动一个AsyncTask,它将遍历一个图像列表,对于每个图像,它将对其进行一些处理。所以基本上,有一个for循环,在其中,另一个AsyncTask被调用。我使用一个类的实例来保存布尔值,以检查每个图像是否完成了它的处理,它被称为dummyStructure。

主线程代码:

new BatchProcessor().execute()

BatchProcessor的doInBackground:

protected Void doInBackground(Void... params){

while(dummyStructure.isWorking())
{
//Try loop
  thread.sleep(1000);
}
  dummyStructure.setIsWorking(true); //basically sets the flag to true
for(String s: pictureList)
{
  RunTheProcessingLoop().execute();
}

问题: 我试过调试,这就是问题是imo,如果我在while循环dummyStrucutre.setIsWorking(true)之外移除行,那么甚至在它完成之前就会调用多个asyncTasks,基本上一切都搞砸了。但是,如果我不删除该行,那么BatchProcessor AsyncTask会在while循环中被捕获,而RunTheProcessingLoop AsyncTask永远不会执行超出其onPreExecute()(调试知道,我在asyncTask的每个方法中都使用了Log.e()

我肯定错过了什么,有什么帮助吗?非常感谢! :)

2 个答案:

答案 0 :(得分:1)

你遇到的是asynctasks被堆积起来,因为你是从另一个开始而不是退出第一个。这是因为默认情况下,asynctasks由单个线程串行处理。如果要并行使用多个线程,则需要使用自己的线程执行程序。有关详细信息,请参阅AsyncTask文档。

答案 1 :(得分:0)

因此,在发布此问题并发现有关人们发布内容的更多信息后2天,我想到了这一点:

我的主线程调用了AsyncTask,我想等待AsyncTask完成。所以我使用了一个布尔标志,AsyncTask一旦完成就设置为false,我可以排队另一个任务。这是代码:

class mExecutor implements Executor {
           public void execute(Runnable r) {
             new Thread(r).start();

         }}

现在,您需要做的就是,无论您想要异步运行什么任务/方法/等,只需创建一个线程并将其推送到该类中,例如:

Thread t = new  Thread(new Runnable() {
                        public void run() {
                            new someshit().execute();
                                }
                            });
new mExecutor().execute(t);

和田田!现在它们都不会排队/同步,而是会并行运行。

如果我错了,请纠正我!谢谢! :)