当前位置: 首页 > 知识库问答 >
问题:

Volley-阻塞方式的超文本传输协议请求

朱锐
2023-03-14

这些天我正在学习如何使用谷歌排球。快速联网非常方便。似乎所有的请求都在Volley的后台运行。例如:

volleyRequestQueue.add(new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, new SignUpResponseListener(), new MyErrorListener()));

使用上面的代码,我们可以进行一个在后台运行的POST调用(非阻塞方式)。现在我的问题是:是否有可能以阻塞的方式进行POST呼叫?为什么我需要阻塞方式来进行REST呼叫?因为有些电话,比如签到,应该在做其他事情之前完成。

谢谢

共有3个答案

欧阳嘉年
2023-03-14

如果您想在截取请求之后执行某些操作,请使用回调侦听器onSuccess(在这种情况下是SignUpResponseListener)并将代码放在那里。这是最好的做法。

姜景焕
2023-03-14

这里有一个更清晰的答案,可以正确处理中断异常以及超时。请注意,只有在您特别打算使用中断来取消对请求的响应时,才需要接受中断并继续。

RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, future, future);
volleyRequestQueue.add(request);

try {
    JSONObject response = null;
    while (response == null) {
        try {
            response = future.get(30, TimeUnit.SECONDS); // Block thread, waiting for response, timeout after 30 seconds
        } catch (InterruptedException e) {
            // Received interrupt signal, but still don't have response
            // Restore thread's interrupted status to use higher up on the call stack
            Thread.currentThread().interrupt();
            // Continue waiting for response (unless you specifically intend to use the interrupt to cancel your request)
        }
    }
    // Do something with response, i.e.
    new SignUpResponseListener().onResponse(response);
} catch (ExecutionException e) {
    // Do something with error, i.e.
    new MyErrorListener().onErrorResponse(new VolleyError(e));
} catch (TimeoutException e) {
    // Do something with timeout, i.e.
    new MyErrorListener().onErrorResponse(new VolleyError(e));
}
端木令
2023-03-14

Volley支持阻止请求通过请求期货。您创建了一个普通的请求,但将其回调设置为您的请求未来,这只是标准java未来的volley扩展。对future.get()的调用将阻塞。

看起来像这样

RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, future, future)
volleyRequestQueue.add(request);

try {
    JSONObject response = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
 类似资料:
  • 我正在使用GWT和Spring controller来管理http流量。有些请求可能需要很长时间,但我希望在超过给定时间时终止请求。 我如何配置超时Spring。我也使用Apache Tomcat 7.0。我试图在tomcat上inrease最大线程,但有一段时间tomcat工作缓慢,因为请求线程不会死。

  • 我有专有的基于http的API要从JMeter测试。不幸的是,API的一些endpoint希望http DELETE方法带有请求体(我知道它的API设计有问题,使用DELETE with request body,但我无法更改该API,需要对其进行测试)。 如何从JMeter测试它?似乎标准的HttpRequest采样器在没有任何警告的情况下默默忽略了我的身体有效载荷。(当我在《邮递员》中尝试它时

  • 我想知道你对这个概念的看法/意见。如果有替代方案?这是否可行/有益? 据我所知,对于每个http请求,服务器都会执行一些操作并返回http响应。 现在考虑任何场景,我们希望对服务器上运行的进程有更多的控制。 情景1:http请求发送- 在这里,资源被浪费了。 情况2:http请求发送- 在这里,客户端不知道服务器中运行的进程的状态。客户端必须等待,直到它获得超文本传输协议响应。 我的想法是:在初始

  • 我有以下伪代码 我想要的是,我循环遍历一个对象数组,每个对象都获得相关的用户和产品,然后订阅用户和产品。我怎么能那样做?

  • 我用Go编写了一个简单的服务器: 以及一个用Python编写的用于测试的简单客户端。以下是代码: 每次客户端访问服务器时,服务器都会产生这个错误: 我知道如何在Go中处理JSON Post请求 Python版本==3.4 Go版本==1.7 先谢谢你。

  • 我有以下curl命令,它在bash shell中运行良好 我现在想通过一个简单的网页运行这个按钮点击。这是我的Javascript 但是当我通过网页按钮点击运行这个javascript时,它给我以下错误“网络错误:500内部服务器错误-http://ec2-54-226-250-92.compute-1.amazonaws.com:8080/ocr”,我的成功()方法永远不会被调用。 正如我所说,