3

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

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

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

谢谢!

4

3 回答 3

3

你可以试试 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)

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

我使用右键单击源包名称并选择 New/Class 创建了 intentservice。我使用 intentservice 作为超类。构造函数有一个“名称”的争论。我将其更改为:

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

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

希望这是你想要的...

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

于 2011-07-31T17:24:24.877 回答
1

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

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

希望这可以帮助你...

于 2013-12-04T01:20:36.263 回答
0

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

于 2011-07-31T17:06:39.487 回答