java - 为什么 future.get() 对于 Volley RequestFuture 总是超时?

标签 java android multithreading networking android-volley

我正在尝试发出同步 Volley 网络请求。我正在使用请求 future 来等待响应,但 future.get() 调用总是超时(无论超时设置为多长时间)。我已经单独测试了每个组件,除了我使用 future 之外,似乎没有什么是导致错误的。关于我在这里做错了什么有什么想法吗?

Activity.java: persistData()

postCampaign(campaign);

Activity.java: postCampaign()

private boolean postCampaign(final Campaign c) {
    RequestFuture<String> future = RequestFuture.newFuture();
    StringRequest request = new StringRequest(Request.Method.POST, url, future, future) {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  params = new HashMap<>();
            // put data
            return params;
        }
    };
    NetworkController.getInstance(this).addToRequestQueue(request);

    try {
        String response = future.get(5, TimeUnit.SECONDS);
        Log.d("Volley", "" + response);
        return !response.contains("Duplicate");
    } catch (InterruptedException|ExecutionException|TimeoutException e) {
        Log.d("Volley", "[FAILED] " + e.getClass());
        return false;
    }
}

但奇怪的是,当单步执行代码时,RequestFuture 的 onResponse 方法似乎被调用并带有适当的响应。所以 RequestFuture 似乎没有正确处理响应。

enter image description here

最佳答案

我想我已经得出结论,要么 Volley 不能完全同步网络请求,要么至少不值得。我最终只是在开始时显示了一个微调器,并在服务器以成功消息响应时在 Volley 请求的 onResponse 方法中停止了它。就用户而言,它的工作方式相同。

关于java - 为什么 future.get() 对于 Volley RequestFuture 总是超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47995386/

相关文章:

java - 如何正确获取eclipse编辑器中当前打开的类?

java - Spring Security tokenRepository CSRF 设置 p :cookieHttpOnly ="false" getting error

java - 将 JSON 子对象属性绑定(bind)到 Jackson 中的 Java 对象字段

c++ - webrtc native 应用程序中的每个对等点是否需要单独的 rtc::Runnable 线程和 PeerConnectionFactory 对象?

android - 如何在android上实现实时音频处理?

java - SAML2 - 响应没有任何可以通过主题验证的有效断言

android - 为什么configurations.all {conf:Configuration->…}编译错误,原因:类型不匹配:推断的类型为Unit但应为 bool 值

java - 如何在公共(public)界面上获取 EditText (Layout.xml) 的值?

java - 任务 ':app:mergeExtDexDebug' 执行失败

iPhone:如何使用performSelector:onThread:withObject:waitUntilDone:方法?