Android Kotlin中如何将Volley请求PHP返回的结果赋值给外部字符串变量
问题根因
你遇到的空值问题本质是Volley网络请求是异步非阻塞逻辑:你调用queue.add(stringRequest)后,系统不会等待网络请求执行完成,会直接往下运行后面的Toast代码,这时候服务端还没返回结果,lastID还没被赋值,自然就是null。只有等网络请求成功/失败后,回调里的赋值逻辑才会执行。
解决方案
你不能直接在请求发起后的同步代码中读取变量值,所有依赖请求结果的逻辑必须在请求完成的通知时机执行,常用实现方案如下:
方案1:自定义回调(无额外依赖,通用)
先封装请求方法,把需要执行的后续逻辑作为回调参数传入,请求完成后触发回调:
// 封装请求方法,传入请求完成后执行的回调 fun fetchLastID(onFinish: (result: String) -> Unit) { val queue = Volley.newRequestQueue(this) val url = "https://uwbeinternational.org/android/getLastSPLId.php" val stringRequest = StringRequest( Request.Method.GET, url, { response -> onFinish(response) }, { onFinish("Fail!") } ) queue.add(stringRequest) }
调用时把需要用到lastID的逻辑都写在回调里:
var lastID: String? = null fetchLastID { result -> lastID = result // 所有需要用到lastID的逻辑都放在此处执行 Toast.makeText(applicationContext, "ID Lautet: $lastID", Toast.LENGTH_LONG).show() // 比如更新UI、存本地、发起其他请求等后续逻辑都写在这里 }
方案2:Kotlin协程(支持同步写法,代码更直观)
如果项目已经使用Kotlin协程,可以将异步请求转为挂起函数,按顺序写逻辑:
// 定义挂起函数封装请求 suspend fun getLastID(): String = suspendCoroutine { cont -> val queue = Volley.newRequestQueue(this) val url = "https://uwbeinternational.org/android/getLastSPLId.php" val stringRequest = StringRequest( Request.Method.GET, url, { response -> cont.resume(response) }, { cont.resume("Fail!") } ) queue.add(stringRequest) }
在协程作用域中调用,后续逻辑可以直接写在请求之后:
var lastID: String? = null // 建议用和页面生命周期绑定的协程作用域,避免内存泄漏 lifecycleScope.launch { lastID = getLastID() // 后续需要用到lastID的逻辑都可以按顺序写在这里 Toast.makeText(applicationContext, "ID Lautet: $lastID", Toast.LENGTH_LONG).show() }
方案3:LiveData(适配MVVM架构)
如果是MVVM架构项目,可以用LiveData做数据观察者:
// 定义LiveData存储结果 val lastIDLiveData = MutableLiveData<String>() // 发起请求 val queue = Volley.newRequestQueue(this) val url = "https://uwbeinternational.org/android/getLastSPLId.php" val stringRequest = StringRequest( Request.Method.GET, url, { response -> lastIDLiveData.postValue(response) }, { lastIDLiveData.postValue("Fail!") } ) queue.add(stringRequest) // 观察结果变化,拿到结果后执行后续逻辑 lastIDLiveData.observe(this) { lastID -> Toast.makeText(applicationContext, "ID Lautet: $lastID", Toast.LENGTH_LONG).show() // 其他后续逻辑写在这里 }
内容的提问来源于stack exchange,提问作者UwBe International
相关产品推荐
相关产品推荐

