我在ResponseFinal日志中得到的List<String> resultList
响应为空。但在循环中,响应显示resultList中的项目
我不明白为什么resultlist在循环外返回空。请帮助
public List<String> getParseJson(String sName)
{
final List<String> resultList = new ArrayList<String>();
String name=sName.replace(" ", "%20");
StringRequest stringRequest = new StringRequest(Request.Method.GET, Constants.BASE_URL + "/suggest_item/items/"+name +"/"+ Constants.API_KEY,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Result handling
try {
JSONObject jsonObj = new JSONObject(response.toString());
JSONArray predsJsonArray = jsonObj.getJSONArray("Item");
for (int i = 0; i < predsJsonArray.length(); i++) {
System.out.println( predsJsonArray.get(i).toString());
resultList.add(predsJsonArray.get(i).toString());
Log.e("Response",resultList.toString());
}
} catch (JSONException e) {
Log.e("JSOn", "Cannot process JSON results", e);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Error handling
System.out.println(error.toString());
}
});
// Adding request to request queue
Volley.newRequestQueue(context).add(stringRequest);
Log.e("ResponseFinal",resultList.toString());
return resultList;
}
我的日志:
E/Response: [1660309, 1660410]
E/ResponseFinal: []
在oncreate()
之前声明List(在类级别定义resultList
)
List<String> resultList = new ArrayList<String>();
您在响应到来之前返回了列表,这就是为什么您得到了空列表。你可以做一些类似下面代码的事情,它可以让你在响应后列出。
步骤1:使用getParseJson()
方法将方法命名为onSuccess(List<String> list)
public void onSuccess(List<String> list){
// do your code here after getting the list
}
//make this method as void
public void getParseJson(String sName){
//your code which you have already implemented
}
步骤2:从onResponse()
方法调用上述方法,该方法在getParseJson()
方法中声明如下:
@Override
public void onResponse(String response) {
// Result handling
try {
JSONObject jsonObj = new JSONObject(response.toString());
JSONArray predsJsonArray = jsonObj.getJSONArray("Item");
for (int i = 0; i < predsJsonArray.length(); i++) {
System.out.println( predsJsonArray.get(i).toString());
resultList.add(predsJsonArray.get(i).toString());
Log.e("Response",resultList.toString());
}
} catch (JSONException e) {
Log.e("JSOn", "Cannot process JSON results", e);
}
//call here
onSuccess(resultList);
}
编辑:如果您从另一个类调用getParseJson()
,则按如下方式调用它:
//If you are having paramaterized constructor then you can give parameter
new YourClassName(){
@Override
public void success(List<String> list) {
// do your code here after getting the list
}
}.getParseJson(String response);
您添加的列表是一个副本,其作用域仅在public void onResponse(String response)内。因此,实际列表与定义时一样是空的。因此,最终日志显示为空。
我不明白为什么
resultList
在循环外返回空。。。
它是空的,因为您的请求是异步运行的。因此,您创建了您的请求和响应侦听器,将其传递给Volley
,然后getParseJson()
返回空列表——因为请求尚未执行,其他代码不会等待它执行。之后,当执行请求时(异步执行),响应侦听器将JSON值添加到resultList
,但为时已晚。
重写代码,使其能够处理Volley请求的异步性质。