【问题标题】:Android Threading (AsyncTasks) acting a little weirdAndroid Threading (AsyncTasks) 有点奇怪
【发布时间】: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


【解决方案1】:

您遇到的是异步任务堆积如山,因为您从另一个开始而不是退出第一个。这是因为异步任务默认由单个线程串行处理。如果要并行使用多个线程,则需要使用自己的线程执行器。有关详细信息,请参阅AsyncTask 文档。

【讨论】:

  • 你太棒了!非常感谢@LarrySchiefer,这对我帮助很大。我知道它可能不属于“Java/Android 中的最佳编程实践”,但好消息是,它可以工作!
  • 很高兴您发现它有帮助!祝你好运!
【解决方案2】:

因此,在发布此问题 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);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多