首页 > 解决方案 > 在 Android Studio 中存储 JSONArrayRequest 响应

问题描述

早上好!我一直在寻找类似的答案,但我找不到它,所以我在这里。

在 Android Studio 中,我做了一个有 jsonArrayRequest 请求的函数,如下所示:

private String requestCoursesInfo() {
    RequestQueue requestQueue = Volley.newRequestQueue(this.context);

    JsonArrayRequest jsonArrayRequest= new JsonArrayRequest(
            Request.Method.GET,
            COURSES_URL,
            null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray coursesJsonArray) {
                    String name;
                    ArrayList<HashMap> coursesBasicInfoList = new ArrayList<>();

                    try {
                        for (int i=0; i < coursesJsonArray.length(); i++){
                            JSONObject courseInfo = coursesJsonArray.getJSONObject(i);

                            name = courseInfo.getString("name");

                            //ArrayList to group all the info
                            HashMap<String, String> currentCourseInfoList = new HashMap<>();

                            currentCourseInfoList.put("name", name);
                            coursesBasicInfoList.add(currentCourseInfoList);
                        }

                    } catch (JSONException e) {
                        //Do something with error
                    }
                }
            },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    // Do something when error occurred
                }
            }
    ){
        @Override
        public Map<String, String> getHeaders() {
            Map<String, String>  params = new HashMap<>();
            params.put("Content-Type", "application/json");

            return params;
        }
    };

    // Add JsonObjectRequest to the RequestQueue
    requestQueue.add(jsonArrayRequest);
    return "courses";
}

如您所见,问题是,一旦我得到响应,我将使用响应中的键和名称值构建一个 HashMap,并将其全部放入courseBasicInfoList ArrayList 中。

问题是,这个变量(coursesBasicInfoList)永远不能从请求外部访问,我想要的是能够把这个数组列表放在函数末尾可以看到的“返回”中。

我知道请求是异步的,但我想它必须以某种方式从响应中存储这些数据才能在其他方法中使用它,不是吗?

谢谢!

标签: androidvariablesrequest

解决方案


您可以使用LiveData来解决异步调用中的同步问题,例如volley.

private MutableLiveData<ArrayList<HashMap>> requestCoursesInfo() {
    MutableLiveData<ArrayList<HashMap>> mutableCoursesBasicInfoList = new MutableLiveData<>();
    RequestQueue requestQueue = Volley.newRequestQueue(this.context);

    JsonArrayRequest jsonArrayRequest= new JsonArrayRequest(
            Request.Method.GET,
            COURSES_URL,
            null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray coursesJsonArray) {
                    String name;
                    ArrayList<HashMap> coursesBasicInfoList = new ArrayList<>();

                    try {
                        for (int i=0; i < coursesJsonArray.length(); i++){
                            JSONObject courseInfo = coursesJsonArray.getJSONObject(i);

                            name = courseInfo.getString("name");

                            //ArrayList to group all the info
                            HashMap<String, String> currentCourseInfoList = new HashMap<>();

                            currentCourseInfoList.put("name", name);
                            coursesBasicInfoList.add(currentCourseInfoList);
                        }

                    } catch (JSONException e) {
                        //Do something with error
                    }

                    //post your result in LiveData
                    mutableCoursesBasicInfoList.postValue(coursesBasicInfoList);
                }
            },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    // Do something when error occurred
                }
            }
    ){
        @Override
        public Map<String, String> getHeaders() {
            Map<String, String>  params = new HashMap<>();
            params.put("Content-Type", "application/json");

            return params;
        }
    };

    // Add JsonObjectRequest to the RequestQueue
    requestQueue.add(jsonArrayRequest);

    //Return MutableLiveData<ArrayList<HashMap>> 
    return mutableCoursesBasicInfoList;
}

并从您的 Activity/Fragment 中观察 LiveData,如下所示:

requestCoursesInfo().observe(this, new Observer<ArrayList<HashMap>>() {
    @Override
    public void onChanged(ArrayList<HashMap> hashMaps) {
        //Do your operation here with ArrayList<HashMap>
    }
});

推荐阅读