等待Android Volley中的所有请求

时间:2014-11-24 15:33:53

标签: android android-volley

我在我的Android应用程序中使用Volley连接到我的REST API,对于某些活动,我想在我的所有请求完成后才采取一些操作。在JavaScript中,对于那些熟悉AngularJS中的承诺的人,我会这样做:

$q.all([
    resourceA.get(),
    resourceB.get(),
    resourceC.get()
])
.then(function (responses) {
    // do something with my responses
})

我如何用Volley做这样的事情?我知道我可以对一些计算待处理请求的整数进行ResponseListener回调检查,但这似乎是一个黑客攻击。有更简单的方法吗?

1 个答案:

答案 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