android - 在 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)永远不能从请求外部访问,我想要的是能够把这个数组列表放在函数末尾可以看到的“返回”中。
我知道请求是异步的,但我想它必须以某种方式从响应中存储这些数据才能在其他方法中使用它,不是吗?
谢谢!
解决方案
您可以使用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>
}
});
推荐阅读
- spring-kafka - 如果生产者应用程序在发送到代理之前崩溃,生产者“buffer.memory”中的消息会发生什么?
- c++ - 如何在 C++ 中将浮点数转换为无符号整数?
- java - 如何使用 Jackson 的 ObjectMapper 从 JSON 字符串创建对象?
- apache-spark - Pyspark 中的表格显示来自 CSV 文件的标题
- mysql - 是否有可能在数据库触发器中使用多个 Before 或 After 语句
- python - 如何在 Django Rest Framework 中接收我不想存储的 json 字段?
- python - 如何将日期时间对象的格式更改为指定格式?
- c - sscanf: %* 不会忽略空字段
- python - 如何使用 sklearn 对 CSV 文件中的多列进行一次热编码?
- docker - Blazor WebAssembly 在 Docker 中运行时无法读取环境变量或查找文件