Nota La risposta @Matthews è corretta MA se ti trovi su un altro thread e fai una chiamata al volo quando non hai internet, il tuo callback di errore verrà chiamato sul thread principale, ma il thread su cui ti trovi verrà bloccato PER SEMPRE. (Pertanto, se quel thread è un IntentService, non sarai mai in grado di inviargli un altro messaggio e il tuo servizio sarà praticamente morto).
Usa la versione get()
che ha un timeout future.get(30, TimeUnit.SECONDS)
e rileva l'errore per uscire dal thread.
Per abbinare la risposta di @Mathews:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// exception handling
} catch (ExecutionException e) {
// exception handling
} catch (TimeoutException e) {
// exception handling
}
Di seguito l'ho avvolto in un metodo e utilizzo una richiesta diversa:
/**
* 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;
}