使用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
相关产品推荐
相关产品推荐

