2017-12-27 426 views
2

我想做一个同步排球网络请求。我正在使用请求期货等待响应,但future.get()通话总是超时(不管超时设置为多长时间)。我已经单独测试了每个组件,除了使用未来之外,没有任何东西似乎导致了错误。关于我在这里没有错的任何想法?为什么future.get()总是为Volley RequestFuture超时?

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

+0

您确定您确实正在向服务器发送请求吗?看起来您使用的是HTTP协议,您是否使用过Fiddler或Wireshark来窥探正在发送的内容? – Imposter

+0

当我使用具有不同响应/错误侦听器的相同字符串请求时,数据成功发布并返回预期响应。我只需要做到这一点同步(我没有运气)。 –

+0

看起来您需要将请求添加到RequestQueue。 'RequestQueue队列= Volley.newRequestQueue(getBaseContext()); queue.add(request);'。让我们知道它是否有效。 – tsolakp

回答

0

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