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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:37:48