在Android Studio中存储JSONArrayRequest响应
早上好!我已经花了很多天寻找类似的答案,但我找不到,所以我来了 在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
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,但我无法将它返回到调用它的原始位置,因为我无法从那里取出它。。。