-1

I need to return my ArrayList but i receive null when I call 'volleyReq'. Please tell me what I am doing wrong? How to return values when there is void inside. I think I should use interface but i don't know how. Thank you.

 public static ArrayList<KladrObject> volleyReq(String contentType,String limit,String query) {
    final String url = new StringBuilder().append("http://kladr-api.ru/api.php?").append("query=" + query).append("&contentType="+contentType).append("&limit="+limit).append("&token=MY KEY").toString();
    final ArrayList<KladrObject> arr = new ArrayList<KladrObject>();
    final JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    //JSONArray array = response.getJSONArray("result");
                    try{
                        JSONArray array = response.getJSONArray("result");
                        for (int i = 0;i<array.length();i++) {
                            KladrObject kladrObject = new KladrObject();
                            kladrObject.setName(array.getJSONObject(i).getString("name"));
                            kladrObject.setType(array.getJSONObject(i).getString("type"));
                            kladrObject.setShortype(array.getJSONObject(i).getString("typeShort"));
                            arr.add(kladrObject);


                        }

                    }catch (JSONException e){

                    }


                }

            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

            //Do what you want to do on error
        }
    });



    AppController.getInstance().getRequestQueue().add(req);
    return  arr;
}

1 Answers1

0

You get a null because the JsonObjectRequest is executed on another thread. So as at the time the method returns, arr is null.

To achieve what you are trying to do, you can pass in the Response.Listener and Response.ErrorListener in the class where you need the response. So your volleyReq method will look like this:

  public static void volleyReq(String contentType,String limit,String query, Response.Listener responseListesner, Response.ErrorListener errorListener) 
    {

            final String url = new StringBuilder().append("http://kladr-api.ru/api.php?").append("query=" + query).append("&contentType="+contentType).append("&limit="+limit).append("&token=MY KEY").toString();
            final ArrayList<KladrObject> arr = new ArrayList<KladrObject>();
            final JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url,
                   responseListener, errorListener);

    }

And your method call will look like this:

final ArrayList<KladrObject> arr = new ArrayList<KladrObject>();
volleyReq("application/json", 100, "searchQuery", new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    //JSONArray array = response.getJSONArray("result");
                    try{
                        JSONArray array = response.getJSONArray("result");
                        for (int i = 0;i<array.length();i++) {
                            KladrObject kladrObject = new KladrObject();
                            kladrObject.setName(array.getJSONObject(i).getString("name"));
                            kladrObject.setType(array.getJSONObject(i).getString("type"));
                            kladrObject.setShortype(array.getJSONObject(i).getString("typeShort"));
                            arr.add(kladrObject);
                        }

                    }catch (JSONException e){

                    }
                }

            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            //Do what you want to do on error
        }
    });
Goke Obasa
  • 4,328
  • 1
  • 18
  • 26