Android-Arraylist在循环外部返回null



我在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请求的异步性质。

最新更新