2017-12-27 423 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方法中停止了它。就用戶而言,它以相同的方式工作。