有谁知道如何轻松地安排多次调用队列中的AsyncTask执行,然后以串行方式执行它们?
我希望被调用的异步任务在它完成之前等待,但似乎我无法完成此任务,即使我测试当前正在执行的任务的状态。
任何想法如何解决这个问题?我已经看到在蜂窝API中有一个方法executeOnExecutor()
带有SERIAL_EXECUTOR
,我想它实现了我所描述的内容。但是,我不是在为蜂窝开发。
谢谢!
答案 0 :(得分:3)
您可以尝试使用IntentService。来自参考文献:
IntentService是服务的基类,可根据需要处理异步请求(表示为Intents)。客户端通过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。
我使用右键单击源包名称并选择New / Class来创建intentservice。我使用intentservice作为超类。构造函数有一个“名称”的争论。我改成了:
public XxxService() {super("XxxService");}
该服务的所有代码都进入了onHandleIntent函数。我没有必要使用任何其他@Override函数。
希望这是你想要的......
注意:变量'context'是onReceive中的传递参数。我将代码中的名称从XxxxService更改为“Service”或“service”。最后,我在所有名为GC的项目中创建了一个类。它是全局常量的容器类。 GC.EXTRA_SERVICE_DATA是一个定义额外键的全局字符串。
答案 1 :(得分:1)
大于Honeycomb的Android版本已将Asynctask的默认执行程序作为串行执行程序。所以如果你的分钟。 SDK版本和目标SDK版本超过12,Asynctasks将根据其执行函数的调用执行。请参阅我在
上关于Asynctask的讨论https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing
希望这可以帮助你...
答案 2 :(得分:0)
我会这样做,有一个数组或队列或计数器,你想在一个活动中执行AsyncTAsk(同一类AsyncTask或不同的类),在AsyncTask,onPostExecute()中,减少计数器(或类似的数据结构)并再次调用AsyncTask。