Kotlin Volley请求全局变量问题:获取手机号后回传为空
解决Volley异步请求导致手机号回传为null的问题
兄弟,你踩了Volley异步请求的经典坑!问题核心在于Volley的网络请求是异步执行的——你现在的代码里,第二个回传请求(rq2)在第一个获取手机号的请求(jor)还没拿到服务器返回结果时,就已经开始执行了,这时候UserInfo.mobile还没被赋值,自然就是null。
为什么会这样?
Volley为了不阻塞主线程,所有网络请求都是在后台线程完成的。你调用rq.add(jor)之后,代码会立刻往下走构建第二个请求的URL,而这时候第一个请求的成功回调(给UserInfo.mobile赋值的那段逻辑)还没被触发呢!
怎么修复?
把第二个请求的逻辑完全放到第一个请求的成功回调里,这样就能保证只有拿到手机号之后,才会发送回传请求。修改后的代码如下:
var url_get_phone: String = url + "get_phone.php?username=" + UserInfo.name var rq = Volley.newRequestQueue(this) var jor = JsonObjectRequest(Request.Method.GET, url_get_phone, null, Response.Listener { response -> // 拿到手机号后再执行回传逻辑 UserInfo.mobile = response.getString("mobile") Toast.makeText(this, "You want to share phone", Toast.LENGTH_LONG).show() // 此处构建回传URL并发送请求 var url_with_phone = url + "add_details.php?" + "mobile=" + UserInfo.mobile + "&description=" + editTextTextMultiLine.text.toString() + "&username=" + UserInfo.name var rq2 = Volley.newRequestQueue(this) var sr = StringRequest(Request.Method.GET, url_with_phone, Response.Listener { response -> Toast.makeText(this,"Details Sent",Toast.LENGTH_LONG).show() }, Response.ErrorListener { // 别忘了处理请求失败的情况 Toast.makeText(this,"Failed to send details",Toast.LENGTH_LONG).show() }) rq2.add(sr) }, Response.ErrorListener { // 处理获取手机号失败的场景 Toast.makeText(this,"Failed to get phone number",Toast.LENGTH_LONG).show() }) rq.add(jor)
额外小贴士
- 建议给
UserInfo.mobile加个空值判断或者默认值,避免后续出现空指针异常 - 如果项目里有很多这种依赖型的异步请求,可以试试用Kotlin协程(Coroutines)来管理,代码会更简洁易读,不用嵌套多层回调
内容的提问来源于stack exchange,提问作者hobonomo
相关产品推荐
相关产品推荐

