หมายเหตุ @ แมทธิวส์คำตอบนั้นถูกต้อง แต่ถ้าคุณอยู่ในเธรดอื่นและคุณทำการโทรแบบวอลเลย์เมื่อคุณไม่มีอินเทอร์เน็ตการโทรกลับข้อผิดพลาดของคุณจะถูกเรียกในเธรดหลัก แต่เธรดที่คุณอยู่จะถูกบล็อกตลอดไป (ดังนั้นหากเธรดนั้นเป็น IntentService คุณจะไม่สามารถส่งข้อความอื่นไปหามันได้และบริการของคุณจะถูกปิดโดยทั่วไป)
ใช้เวอร์ชันget()
ที่หมดเวลาfuture.get(30, TimeUnit.SECONDS)
และตรวจจับข้อผิดพลาดเพื่อออกจากเธรดของคุณ
เพื่อให้ตรงกับคำตอบของ @Mathews:
try {
return future.get(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
}
ด้านล่างฉันห่อด้วยวิธีการและใช้คำขออื่น:
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;
}