从Kotlin协程访问类变量

时间:2018-12-04 21:35:24

标签: android kotlin kotlin-coroutines

我在这里遇到了一个奇怪的问题(对Kotlin和协程来说是新问题)。我正在修改getMovies函数中的类变量。在启动块中,我得到一个JSON,然后我通过GSON运行并获得可变的电影信息条目列表。您可以从Anko看到2个longToasts,其中显示一个Toast,但是第一个显示20,而另一个显示0。为什么? Android Studio不会引发任何错误,我引用的是相同的movieList变量。我在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())
    }
}

1 个答案:

答案 0 :(得分:2)

您的代码是针对实验性协程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. 请求显示“中号”吐司
  3. JSON结果到达
  4. 填充电影列表
  5. 请求显示“获取后大小”烤面包

何时在屏幕上看到吐司的确切细节可能会有所不同,具体取决于Android的政策和抓取速度。