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

使用Volley获取API数据存入全局变量始终返回null的问题

问题

我尝试使用Volley从API获取数据,并将其存储为全局变量,但该变量始终返回null,这是为什么?

示例代码:

JsonObjectRequest jsonRequest = new JsonObjectRequest
            (Request.Method.GET, url, null, response -> {

                try {
                    if (response.getString("action").equals("success")) {

                        checkInTime = response.getString("checkin");
                        checkOutTime = response.getString("chekout");

                        System.out.println(response);


                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }, Throwable::printStackTrace);

    Volley.newRequestQueue(MainActivity.this).add(jsonRequest);

API的JSON响应:

{"action":"success","checkin":"08:30:25","chekout":"blank"}

问题原因与解决办法

1. Volley请求的异步特性(核心原因)

Volley的网络请求是异步执行的——调用add(jsonRequest)后,代码会立刻往下走,不会等待请求返回结果。如果在请求未完成时就访问checkInTime、checkOutTime,它们必然还是null。

比如你要是这么写,肯定拿不到值:

Volley.newRequestQueue(MainActivity.this).add(jsonRequest);
System.out.println(checkInTime); // 请求还没跑完,输出null

解决方式:
所有依赖这两个变量的操作,必须放在Volley的回调Lambda里执行,或者通过自定义回调通知后续逻辑。示例:

JsonObjectRequest jsonRequest = new JsonObjectRequest
            (Request.Method.GET, url, null, response -> {

                try {
                    if (response.getString("action").equals("success")) {

                        checkInTime = response.getString("checkin");
                        checkOutTime = response.getString("chekout");

                        // 在这里处理拿到的数据,比如更新UI、调用业务方法
                        updateTimeDisplay();
                        System.out.println(checkInTime); // 这里能拿到正确值

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }, Throwable::printStackTrace);

Volley.newRequestQueue(MainActivity.this).add(jsonRequest);

2. 全局变量声明问题(次要排查项)

确认checkInTime和checkOutTime是在类级别声明的全局变量,而非局部变量:

// 在Activity或对应的类中声明
private String checkInTime;
private String checkOutTime;

如果变量是在方法内部声明的局部变量,外部访问时自然会是null。

3. JSON字段拼写校验(你的代码没问题,但需留意)

你的代码中chekout的拼写和API响应一致,这部分没问题。但如果后续出现字段拼写错误(比如写成checkout),会导致赋值失败,变量保持null。

内容的提问来源于stack exchange,提问作者Kayes Fahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:45:47