我在这里遇到了一个奇怪的问题(对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())
}
}
答案 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()
}
}
现在,看看您的代码,这就是我期望的代码:
launch
并发协程,最终将从网络中获取一些JSON数据何时在屏幕上看到吐司的确切细节可能会有所不同,具体取决于Android的政策和抓取速度。