Hinweis: Die Antwort von @Matthews ist korrekt, ABER wenn Sie sich in einem anderen Thread befinden und einen Volley-Anruf tätigen, wenn Sie kein Internet haben, wird Ihr Fehlerrückruf im Haupt-Thread aufgerufen, aber der Thread, in dem Sie sich befinden, wird für immer blockiert. (Wenn es sich bei diesem Thread um einen IntentService handelt, können Sie niemals eine weitere Nachricht an ihn senden, und Ihr Dienst ist im Grunde genommen tot.)
Verwenden Sie die Version get()
davon hat eine Zeitüberschreitungfuture.get(30, TimeUnit.SECONDS)
und fangen Sie den Fehler ab, um Ihren Thread zu beenden.
Passend zu @Mathews Antwort:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// exception handling
} catch (ExecutionException e) {
// exception handling
} catch (TimeoutException e) {
// exception handling
}
Unten habe ich es in eine Methode eingewickelt und eine andere Anfrage verwendet:
/**
* 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;
}