Lưu ý @Matthews câu trả lời là NHƯNG nếu bạn đang ở một chủ đề khác và bạn thực hiện một cuộc gọi bóng chuyền khi bạn không có internet, cuộc gọi lại lỗi của bạn sẽ được gọi trên chủ đề chính, nhưng chủ đề bạn đang bật sẽ bị chặn TUYỆT VỜI. (Do đó, nếu chủ đề đó là một IntentService, bạn sẽ không bao giờ có thể gửi một tin nhắn khác đến nó và dịch vụ của bạn về cơ bản sẽ bị chết).
Sử dụng phiên bản get()
có thời gian chờfuture.get(30, TimeUnit.SECONDS)
và bắt lỗi để thoát chuỗi của bạn.
Để khớp với câu trả lời @Mathews:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// exception handling
} catch (ExecutionException e) {
// exception handling
} catch (TimeoutException e) {
// exception handling
}
Dưới đây tôi gói nó trong một phương thức và sử dụng một yêu cầu khác:
/**
* Runs a blocking Volley request
*
* @param method get/put/post etc
* @param url endpoint
* @param errorListener handles errors
* @return the input stream result or exception: NOTE returns null once the onErrorResponse listener has been called
*/
public InputStream runInputStreamRequest(int method, String url, Response.ErrorListener errorListener) {
RequestFuture<InputStream> future = RequestFuture.newFuture();
InputStreamRequest request = new InputStreamRequest(method, url, future, errorListener);
getQueue().add(request);
try {
return future.get(REQUEST_TIMEOUT, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Log.e("Retrieve cards api call interrupted.", e);
errorListener.onErrorResponse(new VolleyError(e));
} catch (ExecutionException e) {
Log.e("Retrieve cards api call failed.", e);
errorListener.onErrorResponse(new VolleyError(e));
} catch (TimeoutException e) {
Log.e("Retrieve cards api call timed out.", e);
errorListener.onErrorResponse(new VolleyError(e));
}
return null;
}