我正在更改方法内的全局变量值并尝试稍后返回它。
在 FetchData.kt(被调用的类)
var homeFeed: HomeFeed? = null // the variable that needs to be changed
fun execute() {
val client = OkHttpClient()
val url =
"..."
val request = Request.Builder().url(url).build()
val res = client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response) {
val ch = response?.body?.string()
val gson = GsonBuilder().create()
homeFeed= gson.fromJson(ch, HomeFeed::class.java) // where the change happens
}
})
}
fun GetData(): HomeFeed? {
return homeFeed
}
Run Code Online (Sandbox Code Playgroud)
在 MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn.setOnClickListener {
val destination = "destination"
val places = FetchData(destination)
places.execute()
val data = places.GetData()
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在MainActivity中将Null值分配给“data”变量,就好像返回的“homeFeed”变量根本没有改变一样。
我调试了代码以确保 api 调用不会发生错误,并且变量在方法内部(但不在方法外部!)
我真的坚持这一点,有什么帮助吗?
您getData()在发出异步请求后立即调用,因此它没有机会更新。异步函数不会立即返回。某些后台线程执行某些操作(网络请求),并且在这种情况下会onResponse在将来某个时间返回结果时调用。
就像按钮上的侦听器一样。侦听器中的代码不会立即运行,而是在用户按下它时的某个时间运行。
您的函数可以不使用此成员属性,而是可以采用在结果准备好时调用的回调参数:
fun execute(resultHandler: (HomeFeed) -> Unit) {
//... snip ...
client.newCall(request).enqueue(object : Callback {
// ... snip ...
override fun onResponse(call: Call, response: Response) {
val ch = response?.body?.string()
val gson = GsonBuilder().create()
resultHandler(gson.fromJson(ch, HomeFeed::class.java))
}
})
}
Run Code Online (Sandbox Code Playgroud)
然后当你调用它时,你传递了一个 lambda,当结果准备好时将调用它:
btn.setOnClickListener {
val destination = "destination"
val places = FetchData(destination)
places.execute { homeFeedData ->
// Do something with homeFeedData when it arrives
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |