Uwaga Odpowiedź @Matthews jest prawidłowa, ALE jeśli jesteś w innym wątku i wykonujesz wolej, gdy nie masz internetu, twoje wywołanie zwrotne błędu zostanie wywołane w głównym wątku, ale wątek, w którym jesteś, zostanie ZAWSZE zablokowany.(Dlatego jeśli ten wątek jest IntentService, nigdy nie będziesz mógł wysłać do niego kolejnej wiadomości, a Twoja usługa będzie w zasadzie martwa).
Użyj wersji, get()
która ma limit czasu future.get(30, TimeUnit.SECONDS)
i złap błąd, aby wyjść z wątku.
Aby dopasować @Mathews odpowiedź:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
}
Poniżej zawinąłem to w metodę i używam innego żądania:
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;
}