android - 从 Kotlin 协程访问类变量
问题描述
我在这里遇到了一个奇怪的问题(Kotlin 和协程的新手)。我正在修改函数 getMovies 中的类变量。在启动块中,我得到一个 JSON,然后我通过 GSON 运行它并得到一个可变的电影信息条目列表。您可以从 Anko 看到 2 个显示 Toast 的 longToast,但第一个显示 20,另一个显示 0。这是为什么呢?Android Studio 不会抛出任何错误,我引用的是同一个 moviesList 变量。我在互联网上尝试了许多博客和说明,但找不到任何有用的东西。任何帮助将不胜感激!
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 数据- 请求显示“即时大小”吐司
- JSON 结果到达
- 填充电影列表
- 请求显示“获取后的大小”吐司
当您在屏幕上看到 toast 时,具体细节可能会有所不同,具体取决于 Android 的政策和获取速度。
推荐阅读
- javascript - Express-validator bail() 函数与 jest bail() 函数冲突
- java - 在数据集中显示小数
- javascript - 如果我传递序列化的 json 数据,它会出现在 http 请求中的什么位置?
- python - 如何将分类报告和混淆矩阵的输出导出为pdf或excel文件
- linux - 如何在 Linux 中查看用户的空闲时间?
- node.js - 在 NodeJS 中将背景图像添加到现有 PDF
- reactjs - 理解 Svelte 中的上下文(从 React 上下文转换)
- sql - 外键和计数加权排名的全文搜索
- python - 在基于 pytorch 的对象检测的这段代码中,我在哪里出错了?
- java - 使用 Java 流过滤对象的 ArrayList 以返回 String 类型的 ArrayList