【问题标题】:Serial Execution of multiple AsyncTasks多个 AsyncTask 的串行执行
【发布时间】:2011-07-31 16:26:28
【问题描述】:

有谁知道如何轻松地在队列或其他东西中安排对 AsyncTask 执行的多个调用,然后以串行方式执行它们?

我希望被调用的异步任务在完成之前等待,但似乎我无法完成这一点,即使我测试了当前正在执行的任务的状态。

任何想法如何解决这个问题?我已经看到在蜂窝 API 中有一个方法 executeOnExecutor()SERIAL_EXECUTOR,我想它实现了我所描述的。但是,我不是为蜂窝开发的。

谢谢!

【问题讨论】:

    标签: android android-asynctask android-2.2-froyo executor


    【解决方案1】:

    您可以尝试 IntentService。来自参考:

    IntentService 是按需处理异步请求(表示为 Intent)的服务的基类。客户端通过 startService(Intent) 调用发送请求;服务根据需要启动,使用工作线程依次处理每个 Intent,并在工作结束时自行停止。

    我从广播接收器运行服务如下:

        // Now let the service module do the rest
    
        Intent serviceIntent = new Intent(context, Service.class);
        serviceIntent.putExtra(GC.EXTRA_SERVICE_DATA, serviceData);
        ComponentName compName = context.startService(serviceIntent)
    

    它像宣传的那样工作。请求序列化得很好。该服务在收到请求时启动。服务在处理完最后一个请求后停止。请求被 FIFO 处理。

    我使用右键单击源包名称并选择新建/类创建了意图服务。我使用 intentservice 作为超类。构造函数有一个“名称”的争论。我把它改成:

        public XxxService() {super("XxxService");}
    

    服务的所有代码都进入了 onHandleIntent 函数。我不必使用任何其他 @Override 函数。

    希望这是你想要的...

    注意:变量'context'是onReceive中传递的参数。我将代码中的名称从 XxxxService 更改为“服务”或“服务”。最后,我在所有项目中创建了一个名为 GC 的类。它是全局常量的容器类。 GC.EXTRA_SERVICE_DATA 是定义额外键的全局字符串。

    【讨论】:

    • AsyncTask 似乎非常适合我的任务(将文件上传到服务器),这是困扰我的序列化。我可以尝试使用服务,但我认为 AsyncTask 是最好的方法,因为它很灵活并且在 Activity 中被重复调用
    • intentservice 的目的之一是上传/下载文件。可以反复调用。序列化的是来自活动的调用。基本上,它适用于你刚才所说的一切。
    【解决方案2】:

    高于 Honeycomb 的 Android 版本已将 Asynctask 的默认执行器设置为串行执行器。所以,如果你的分钟。 SDK版本和目标SDK版本大于12,Asynctasks会按照其execute函数的调用执行。请参阅我在

    上关于 Asynctask 的讨论

    https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing

    希望对你有帮助...

    【讨论】:

      【解决方案3】:

      我会这样做,有一个数组或队列或计数器,您希望在活动中执行 AsyncTAsk(AsyncTask 的同一类或不同类)的次数,在 AsyncTask 中,onPostExecute(),递减计数器(或类似的数据结构)并再次调用 AsyncTask。

      【讨论】:

      • 好吧,我已经尝试过类似的事情,在 onPostExecute() 中更改了一个标志,但问题是我希望队列中的最后一个任务在前一个任务完成后专门执行,并且递减计数器或更改标志显然没有实现这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多