使用Volley获取响应后生成自定义对象ArrayList为空如何解决
问题原因
Volley的网络请求属于异步执行逻辑:requestQueue.add(jsonObjectRequest)只是把请求加入队列,不会阻塞主线程后续代码执行。你写在最后的Log.d是主线程同步执行的,此时网络请求还没完成,onResponse回调还没触发,newsArrayList自然还没被填充数据,所以打印为空,和ArrayList封装逻辑无关。
修复方案
1. 把数据操作逻辑移到回调内部
所有需要用到newsArrayList的逻辑(打印、刷新列表、UI更新等)都要放到onResponse的解析逻辑之后,修正后的代码示例:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<News> newsArrayList = new ArrayList<>(); RequestQueue requestQueue = Volley.newRequestQueue(this); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, mURL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { JSONArray articles = response.getJSONArray("articles"); // 优化:避免返回数组长度不足10导致越界 for (int i = 0; i < Math.min(10, articles.length()); i++) { JSONObject news = articles.getJSONObject(i); String title = news.getString("title"); String img_url = news.getString("image"); String desc = news.getString("description"); String news_url = news.getString("url"); newsArrayList.add(new News(title, img_url, desc, news_url)); } // 在这里操作填充完成的ArrayList Log.d(TAG, "onResponse: 列表长度:" + newsArrayList.size()); Log.d(TAG, "onResponse: 列表内容:" + newsArrayList); // 如果要更新UI(比如给RecyclerView设置数据)也在这里操作 // updateUI(newsArrayList); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "onErrorResponse: Something went Wrong"); } }); requestQueue.add(jsonObjectRequest); }
2. 跨方法使用数据的处理
如果需要把数据传到其他方法处理,单独封装处理逻辑即可:
// 单独封装数据处理方法 private void processNewsData(ArrayList<News> newsList) { // 这里执行你需要的逻辑:存库、传值给适配器、跳转传值等 } // 在onResponse解析完成后调用 processNewsData(newsArrayList);
注意事项
- 如果要给
News类的对象打印可识别的内容,建议重写News类的toString()方法,否则打印出来的是对象内存地址:
// 在News.java中添加 @Override public String toString() { return "News{" + "mTitle='" + mTitle + '\'' + ", mDesc='" + mDesc + '\'' + '}'; }
- 注意校验接口返回的字段名和你解析的字段是否完全一致,字段不匹配也会导致解析失败没有数据。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

