gpt4 book ai didi

android - 无法更改 Kotlin 中的全局变量值

转载 作者:行者123 更新时间:2023-11-29 14:57:37 24 4
gpt4 key购买 nike

我正在方法中更改一个全局变量值并尝试稍后返回它。

在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
}

在 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()
}
}

问题是 Null 值被分配给 MainActivity 中的“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))
}
})

}

然后当你调用它时,你传递一个 lambda 表达式,当结果准备好时将调用它:

   btn.setOnClickListener {
val destination = "destination"
val places = FetchData(destination)
places.execute { homeFeedData ->
// Do something with homeFeedData when it arrives
}
}

关于android - 无法更改 Kotlin 中的全局变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59381613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com