多个AsyncTask的串行执行

3

有没有人知道如何轻松地将多个调用 AsyncTask 执行排列在队列中或其他地方,然后按顺序执行它们?

我希望所调用的异步任务在前一个任务完成后等待,但是似乎我无法实现这一点,即使我测试当前正在执行的任务的状态也不行。

有什么解决办法吗?我看到在蜂巢 API 中有一个方法 executeOnExecutor(),其中包含一个 SERIAL_EXECUTOR,我猜它实现了我所描述的功能。然而,我不是为蜂巢开发。

谢谢!

3个回答

3
您可以尝试使用IntentService。根据参考文献:
IntentService是处理按需异步请求(表示为意图)的服务的基类。客户端通过startService(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用作超类。构造函数有一个名为“name”的参数。我将其更改为:

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

所有服务的代码都集中在onHandleIntent函数中。我不需要使用任何其他@ Override函数。

希望这就是你想要的...

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


AsyncTask 对于我的任务(上传文件到服务器)似乎非常完美,但是序列化让我感到困扰。我可以尝试使用服务,但我认为 AsyncTask 是最好的选择,因为它灵活,并且在 Activity 中被反复调用。 - dulys
Intentservice 的一个目的是上传/下载文件。它可以被重复调用。序列化的是来自活动的调用。基本上,它适用于您刚才说的一切。 - Howard Hodson

1

0
我会这样做,创建一个数组、队列或计数器,保存您想要在活动中执行AsyncTask(同一类AsyncTask或不同的类)的次数。在AsyncTask的onPostExecute()方法中,减少计数器(或类似数据结构)的值,并再次调用AsyncTask。

嗯,我已经尝试过类似的方法,在onPostExecute()中改变了一个标志位,但问题是我希望队列中的最后一个任务在前一个任务完成后特定地执行,而减少计数器或改变标志位似乎无法实现这一点。 - dulys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接