如何在android volley中等待另一个响应监听器完成?

时间:2016-10-17 11:00:10

标签: java android multithreading android-volley q

是否可以同步两个齐射请求,以便一个侦听器将始终在另一个之后执行,而不管其请求返回的顺序如何?

我正在两次调用外部(由其他人拥有/运行) 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作为超级构造函数是私人的。

感谢。

2 个答案:

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

使用Semaphore执行此任务。

例如Semaphore(-2)只有在acquire()次调用

之后才会接受release()