Зауважте, що відповідь @Matthews правильна, Але якщо ви перебуваєте на іншій програмі, і ви здійснюєте дзвінок у залп, коли у вас немає Інтернету, ваш зворотний виклик помилок буде викликаний на основній темі, але нитка, на якій ви знаходитесь, буде заблокована НАЗАД. (Тому, якщо цей потік є IntentService, ви ніколи не зможете надіслати на нього ще одне повідомлення, і ваша служба буде в основному мертвою).
Скористайтеся версією, get()
яка має тайм-аут, future.get(30, TimeUnit.SECONDS)
і введіть помилку, щоб вийти з потоку.
Щоб відповісти @Mathews відповідь:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// exception handling
} catch (ExecutionException e) {
// exception handling
} catch (TimeoutException e) {
// exception handling
}
Нижче я обгорнув його методом і використовую інший запит:
/**
* 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;
}