我在我的Android应用程序中使用Volley连接到我的REST API,对于某些活动,我想在我的所有请求完成后才采取一些操作。在JavaScript中,对于那些熟悉AngularJS中的承诺的人,我会这样做:
$q.all([
resourceA.get(),
resourceB.get(),
resourceC.get()
])
.then(function (responses) {
// do something with my responses
})
我如何用Volley做这样的事情?我知道我可以对一些计算待处理请求的整数进行ResponseListener回调检查,但这似乎是一个黑客攻击。有更简单的方法吗?
答案 0 :(得分:5)
您可以使用CountDownLatch。
它是一个特殊对象,它阻止当前线程,直到它自己的内部计数变为0。
由于它阻止当前线程,您必须在单独的线程中执行它(如果您从服务发送您的Volley请求,则必须在服务中执行)。
实施例:
this.mRequestCount = 0;
performFirstVolleyRequest(); // this method does mRequestCount++;
performSecondVolleyRequest(); // this one too ...
performThirdVolleyRequest(); // guess what ?!! This one too
// this.mRequestCount = 3. You have 3 running request.
this.mCountDownLatch requestCountDown = new CountDownLatch(mRequestCount);
final Handler mainThreadHandler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
requestCountDown.await();
mainThreadHandler.post(new Runnable() {
doSomethingWithAllTheResults();
});
}
}).start();
...
private static class FirstVolleyRequestListener extends Response.Listener() {
public void onResponse(Data yourData) {
// save your data in the activity for futur use
mFirstRequestData = yourData;
mCountDownLatch.countDown();
}
}
// You have other Volley Listeners like this one