从 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()
}
}
现在,看看你的代码,这是我期望它做的:
launch
一个并发协程,最终会从网络中获取一些 JSON 数据
- 请求显示 "Immediate size" toast
- JSON 结果到了
- 填充电影列表
- 请求显示 "Size after fetching" toast
您在屏幕上看到祝酒词的具体细节可能会有所不同,具体取决于 Android 的政策和您的获取速度。
我在这里遇到了一个奇怪的问题(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()
}
}
现在,看看你的代码,这是我期望它做的:
launch
一个并发协程,最终会从网络中获取一些 JSON 数据- 请求显示 "Immediate size" toast
- JSON 结果到了
- 填充电影列表
- 请求显示 "Size after fetching" toast
您在屏幕上看到祝酒词的具体细节可能会有所不同,具体取决于 Android 的政策和您的获取速度。