【发布时间】:2014-08-26 23:43:11
【问题描述】:
从我的主线程中,我启动了一个 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() 之外执行(调试后知道,我使用了 Log.e() 在该 asyncTask 的每个方法)。
我肯定错过了一些东西,有什么帮助吗?非常感谢! :)
【问题讨论】:
-
为什么要从另一个异步任务中调用一个异步任务? Android 中的异步基本上是在主应用程序框架内工作的预定作业。这通常可以通过确保所有这些类型的作业从相同的调度机制运行来节省 cpu 资源。当您调用 execute 时,它会将其添加到调度队列中,没有任何逻辑可以阻止您将作业多次添加到调度程序中。
-
我明白你在说什么。但是,我如何从主线程调用主 AsyncTask ->
RunTheProcessingLoop()并等待它完成?我相信我需要根据要求多次调用它。 :\ -
不要从主线程运行。等待 AsyncTask 完成通常违反 AsyncTask 的设计。 AsyncTasks 的第一条规则是 AsyncTasks 运行的所有逻辑都应该可以从其他任何地方直接访问,而不是通过 AsyncTask 受限接口。这允许您直接从其他任务调用不同的任务块。将尽可能多的该类的代码发布到 pastebin,我会修复它。
标签: android multithreading android-asynctask