从 Kotlin 协程访问 class 个变量

Accessing class variables from a Kotlin coroutine

我在这里遇到了一个奇怪的问题(Kotlin 和协程的新手)。我正在修改函数 getMovies 中的 class 变量。在启动块中,我得到一个 JSON 然后我通过 GSON 运行 并获得电影信息条目的可变列表。你可以看到来自 Anko 的 2 个 longToasts 显示 Toast,但第一个显示 20,另一个显示 0。这是为什么? Android Studio 没有抛出任何错误,我引用了相同的 moviesList 变量。我在 Internet 上尝试了很多博客和说明,但找不到任何有用的东西。任何帮助将不胜感激!

class MainActivity : Activity() {

private var moviesList: MutableList<Movie> = mutableListOf()

fun getMovies() {
        launch(UI){
            val result = async(CommonPool){
                getResponseJSON()
            }.await()
            moviesList = Gson().fromJson(result, MovieDBResponse::class.java).results
            longToast(moviesList.size.toString())
        }
        longToast(moviesList.size.toString())
    }
}

您的代码是针对实验性协程编写的API,所以让我先将其升级到 Kotlin 1.3 并修复一些明显的错误:

class MainActivity : Activity(), CoroutineScope {
    override val coroutineContext = Dispatchers.Main + SupervisorJob()

    private val moviesList: MutableList<Movie> = mutableListOf()

    fun getMovies() {
        launch {
            val result = withContext(Dispatchers.IO) { getResponseJSON() }
            moviesList += Gson().fromJson(result, MovieDBResponse::class.java).results
            longToast("Size after fetching: ${moviesList.size}")
        }
        longToast("Immediate size: ${moviesList.size}")
    }

    override fun onDestroy() {
        super.onDestroy()
        coroutineContext[Job]!!.cancel()
    }
}

现在,看看你的代码,这是我期望它做的:

  1. launch 一个并发协程,最终会从网络中获取一些 JSON 数据
  2. 请求显示 "Immediate size" toast
  3. JSON 结果到了
  4. 填充电影列表
  5. 请求显示 "Size after fetching" toast

您在屏幕上看到祝酒词的具体细节可能会有所不同,具体取决于 Android 的政策和您的获取速度。