无法在 Kotlin 中更改全局变量值

Ham*_*di 2 android kotlin

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

在 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 调用不会发生错误,并且变量在方法内部(但不在方法外部!)

我真的坚持这一点,有什么帮助吗?

Ten*_*r04 5

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)