দ্রষ্টব্য @ ম্যাথিউজের উত্তরটি সঠিক তবে তবে আপনি যদি অন্য থ্রেডে থাকেন এবং আপনার যখন ইন্টারনেট না থাকে আপনি একটি ভলির কল করেন, তবে আপনার ত্রুটি কলব্যাকটি মূল থ্রেডে কল করা হবে, তবে আপনি যে থ্রেডটিতে রয়েছেন তা বন্ধ করে দেওয়া হবে। (অতএব যদি সেই থ্রেডটি কোনও ইনটেন্ট সার্ভিস হয় তবে আপনি এটিতে আর কোনও বার্তা প্রেরণ করতে পারবেন না এবং আপনার পরিষেবাটি মূলত মারা যাবে)।
get()
একটি সময়সীমা আছে এর সংস্করণটি ব্যবহার করুন future.get(30, TimeUnit.SECONDS)
এবং আপনার থ্রেড থেকে প্রস্থান করতে ত্রুটিটি ধরুন।
@ ম্যাথিউজ উত্তর মেলে:
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;
}