You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:48:05