Search code examples
androidandroid-volleygetjson

Android volley get request does not work on first time


I would like to send a new JsonObjectRequest request (GET)

Here is my code below:

    final VolleyApplication volleyApplication = VolleyApplication.getInstance();
        volleyApplication.init(getApplicationContext());

        JsonArrayRequest req = new JsonArrayRequest("http://localhost:8080/webapi/", new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                try {
                    VolleyLog.v("Response:%n %s", response.toString(4));
                    System.out.print(response.toString());
                    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
                    Type listType = new TypeToken<List<MyEntity>>() {
                    }.getType();
                    myList = gson.fromJson(response.toString(), listType);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
                , new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.e("Error: ", error.getMessage());
                System.out.print(error.getMessage());
            }
        }
        );
RequestQueue requestQueue = volleyApplication.getRequestQueue();
        requestQueue.add(req);

this works on onCreate and list some object but it does not. As i see in debug mode,process works two times for this method. In first time when it is at RequestQueue requestQueue = volleyApplication.getRequestQueue(); requestQueue.add(req);.... line it jumps out to end of the method. But it works and gets data for second time. This messed up my code.

And also my VolleyApplication class here below

public final class VolleyApplication {

    private static VolleyApplication instance = null;


    public static final VolleyApplication getInstance() {
        if (instance == null) {
            instance = new VolleyApplication();
        }
        return instance;
    }

    private RequestQueue requestQueue;
    private ImageLoader imageLoader;
    private boolean initialized = false;

    private VolleyApplication() {
    }

    public void init(final Context context) {
        if (initialized) {
            return;
        }

        requestQueue = Volley.newRequestQueue(context);
        int memory = ((ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
        int cacheSize = 1024 * 1024 * memory / 8;

        // imageLoader = new ImageLoader(requestQueue, new BitmapLruCache(cacheSize));
    }

    public RequestQueue getRequestQueue() {
        if (requestQueue == null) {
            throw new RuntimeException("Init first");
        }
        return requestQueue;
    }

    public ImageLoader getImageLoader() {
        if (imageLoader == null) {
            throw new RuntimeException("Init first");
        }
        return imageLoader;
    }

}

Solution

  • @seradd

    You are interpreting it wrong.

    It is actually executing only one time. What you are seeing in debug mode is that,

    First time it is creating requestObject and adding it to RequestQueue. RequestQueue then execute it and once it will get response from URL it will execute its callback functions onResponse() and onErrorResponse() from Response.Listener and Response.ErrorListener interface respectively.

    So what I suggest you , whatever task you are doing after adding task to RequestQueue call add that code to onResponse() method