I want to build a Utils class to make Volley calls simpler, like this:
Utils.java:
public class Utils {
static JsonObjectRequest mJsonObjectRequest;
protected static boolean busy = true;
public static JSONObject makeJsonObjectRequest(Context context, int method, String url){
final JSONObject[] jsonObject = new JSONObject[1];
mJsonObjectRequest = new JsonObjectRequest
(method, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
jsonObject[0] = response;
busy = false;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
try {
jsonObject[0] = new JSONObject(error.toString());
} catch (JSONException e) {
e.printStackTrace();
}
busy = false;
}
});
// Access the RequestQueue through your singleton class.
VolleySingleton.getInstance(context).addToRequestQueue(mJsonObjectRequest);
while (true) {
if (!busy) break;
}
return jsonObject[0];
}
}
MainActivity.java:
JSONObject jsonObject = Utils.makeJsonObjectRequest(this, Request.Method.GET, url);
mTxtDisplay.setText("Response: " + jsonObject.toString());
When app runs, jsonObject always null. I want to ask if I can delay return jsonObject[0] inside makeJsonObjectRequest until onResponse called. Can I do that and how? .
I created this and managed like the following way please have a look, hope it will be useful to you
And the interface for call back on request completed is
Thanks to @Gennadii Saprykin's and @Gopal Singh Sirvi's answers, I have tried both Callable and Interface Listener ways. Both worked, however, I prefer Listener way.
OnRequestCompletedListener.java:
Utils.java:
MainActivity.java:
Once again, thank you all for your help!
If you execute
makeJsonObjectRequest
on a background thread, then you can execute synchronous Volley request this way: Can I do a synchronous request with volley?If you execute
makeJsonObjectRequest
on the UI thread, then you shouldn't wait foronResponse
to avoid blocking UI thread. Use callback in this case.