是否可以同步两个齐射请求,以便一个侦听器将始终在另一个之后执行,而不管其请求返回的顺序如何?
我正在两次调用外部(由其他人拥有/运行) API,其中第一个调用提供一些数据,第二个调用添加一些必要的信息。但是,在处理第一个响应之前,我无法添加第二个响应中的信息(一个例子是考虑请求1返回文本,请求2是一个应该是粗体的单词列表)。
我到目前为止尝试的方法是在我的两个听众之间共享一个AtomicBoolean
,其中第一个进行处理并运行complete.set(true)
。 第二个侦听器也具有相同的AtomicBoolean
,并执行以下操作以等待:
while (!complete.get()) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我已经尝试过的另一种方法是使用信号量来实现相同的功能 - 一个带有一个许可证的信号量,这是在发送请求之前预先获取的。第一个监听器发布此许可证,而第二个监听器等待获取它。
当第二个请求在第一个请求之前返回时,两种方法都会失败,而我的刷卡到刷新视图就会冻结。我宁愿不从onResponse
为第一个请求提出第二个请求,因为API非常慢 - 同步执行请求会使显示所有信息的时间加倍。
我还考虑将第一个响应作为RequestFuture
并将其传递给第二个请求的侦听器。然后使用RequestFuture.get()
等待结果,但我找不到将我的第一个响应回调附加到将来完成运行的方法 - 我不能继承RequestFuture
作为超级构造函数是私人的。
感谢。
答案 0 :(得分:0)
通过一些进一步的调试,我发现问题是Volley在主线程上运行onResponse
方法。因此,当我的第二个请求在第一个请求之前完成时,它将在主线程上等待并且第一个侦听器的onResponse
将永远不会运行 - 这意味着第二个侦听器上的等待永远不会停止,冻结应用程序。 / p>
我能够通过执行与以前相同的操作来解决这个问题,但是使用runnables在自己的线程中调用两个onResponse
方法。 E.g。
public void onResponse(final JSONObject response) {
Runnable actualRunnable = new Runnable() {
public void run() {
oldOnResponse(response);
}
};
(new Thread(actualRunnable)).start();
}
如果您打算使用此方法并且需要响应完全影响UI,请注意您需要将活动传递到响应中并使用以下方法调用引用UI线程上的视图的任何代码:
activity.runOnUiThread(new Runnable() {
public void run() {
// This code changes the UI
}
});
答案 1 :(得分:-2)