Catatan @Matthews jawaban benar TETAPI jika Anda berada di utas lainnya dan Anda melakukan panggilan voli ketika Anda tidak memiliki internet, panggilan balik kesalahan Anda akan dipanggil pada utas utama, tetapi utas yang Anda ikuti akan diblokir SELAMANYA. (Oleh karena itu jika utas itu adalah IntentService, Anda tidak akan pernah bisa mengirim pesan lain padanya dan layanan Anda pada dasarnya mati).
Gunakan versi get()
yang memiliki batas waktufuture.get(30, TimeUnit.SECONDS)
dan tangkap kesalahan untuk keluar dari utas Anda.
Untuk mencocokkan jawaban @Mathews:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// exception handling
} catch (ExecutionException e) {
// exception handling
} catch (TimeoutException e) {
// exception handling
}
Di bawah ini saya membungkusnya dengan metode & menggunakan permintaan yang berbeda:
/**
* 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;
}