在Android Studio中存储JSONArrayRequest响应

在Android Studio中存储JSONArrayRequest响应,android,variables,request,Android,Variables,Request,早上好!我已经花了很多天寻找类似的答案,但我找不到,所以我来了 在Android Studio中,我做了一个函数,它有一个jsonArrayRequest请求,如下所示: private String requestCoursesInfo() { RequestQueue requestQueue = Volley.newRequestQueue(this.context); JsonArrayRequest jsonArrayRequest= new JsonArrayReq

早上好!我已经花了很多天寻找类似的答案,但我找不到,所以我来了

在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";
}
private String requestCoursesInfo(){
RequestQueue RequestQueue=Volley.newRequestQueue(this.context);
JsonArrayRequest JsonArrayRequest=新JsonArrayRequest(
Request.Method.GET,
课程网址:,
无效的
新的Response.Listener(){
@凌驾
公共响应无效(JSONArray课程JSONArray){
字符串名;
ArrayList CourseSBasicInfo=新ArrayList();
试一试{
对于(int i=0;i
正如你所看到的,一旦我得到了响应,我就用键name和响应中的名称值构建了一个HashMap,然后我把它全部放在CourseSBasicFolistArrayList中

问题是,这个变量(coursesBasicInfoList)永远无法从请求外部访问,我想要的是能够将这个arraylist放在函数末尾可以看到的“return”中

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


谢谢大家!

您可以使用
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;
}
private MutableLiveData requestCoursesInfo(){
MutableLiveData mutableCoursesBasicInfoList=新的MutableLiveData();
RequestQueue RequestQueue=Volley.newRequestQueue(this.context);
JsonArrayRequest JsonArrayRequest=新JsonArrayRequest(
Request.Method.GET,
课程网址:,
无效的
新的Response.Listener(){
@凌驾
公共响应无效(JSONArray课程JSONArray){
字符串名;
ArrayList CourseSBasicInfo=新ArrayList();
试一试{
对于(int i=0;i
然后观察活动/片段中的LiveData,如下所示:

requestCoursesInfo().observe(this, new Observer<ArrayList<HashMap>>() {
    @Override
    public void onChanged(ArrayList<HashMap> hashMaps) {
        //Do your operation here with ArrayList<HashMap>
    }
});
requestCoursesInfo().observe(这个,新的观察者(){
@凌驾
更改后的公共void(ArrayList哈希映射){
//使用ArrayList在此处执行操作
}
});

也许可以帮你吗?我已经试过了,而且效果很好!但最后我有一个函数调用覆盖,响应在覆盖范围内,我不能把它取出来,所以我处于相同的情况……好吧,这看起来很酷!但问题是,在片段中,我通过Courses.getBasicInfo()调用函数,在这个类方法中,我调用requestCoursesInfo()(在您的示例中),因此最后我有一个覆盖方法,该方法的函数为whithin,但我无法将它返回到调用它的原始位置,因为我无法从那里取出它。。。