我在处理交易请求时遇到问题。说请求A依赖于请求B和请求C的结果。我想将所有A,B和C放入SpiceService的请求队列中。通过这种方式,任务将很容易保持请求在后台运行。
我当前的实现是处理请求B,C,收集他们的响应,然后,从Activity,使用从请求B和C获得的数据启动请求A.但是当活动暂停时,请求A将永远不会被推送到请求队列。 (一旦Activity返回,请求A将被推送到请求队列,并使用addListenerIfPending
和getDataFromCache
检查请求B和C的状态
另一个想法是实现一个服务,负责向SpiceService而不是Activity发出请求。但它有点复杂。
问题的理想解决方案可能是实现嵌套请求,即将请求A,B和C推送到请求队列中,并且请求A监听来自请求B和C的数据。但这需要访问像SpiceManager这样的东西来自在SpiceService管理的线程上运行的SpiceRequest。我想知道以这种方式使用RS是否有任何问题。
另一个问题是请求A将阻塞等待来自请求B和C的完成信号。是否有任何SpiceRequest实现在异步方法中实现loadDataFromNetwork()
?
答案 0 :(得分:0)
在我看来,这样的场景("并行运行B和C,然后运行A")应该是Robospice的一个单一的工作和平(SpiceRequest
) 。我只是创建自己的SpiceRequest
实现,在其loadDataFromNetwork()
方法中运行多个网络请求。它可以在此方法中生成其他线程以并行运行B和C请求。
还有另一个很好的库可以帮助你处理异步"任务之间的依赖关系。名为Bolts-Android(https://github.com/BoltsFramework/Bolts-Android)。
以下是我如何使用它并行运行两个任务并等待它们完成:
List<Task<Void>> tasks = new LinkedList<Task<Void>>();
tasks.add(Task.call(new Callable<Void>() {
@Override
public Void call() throws Exception {
//do task a
}
}));
tasks.add(Task.call(new Callable<Void>() {
@Override
public Void call() throws Exception {
//do task b
}
}));
Task.whenAll(tasks).waitForCompletion();