【发布时间】:2021-02-22 21:13:07
【问题描述】:
我已经全局声明了变量并更新了 cooutinScope 中的值。当我调用 cooutinScope 之外的值时,它的值不会更新。我如何在外部访问 cooutinScop 内部更新的值。这是示例。在通过 HTTP 客户端燃料从端点获取一些数据后,我需要更新变量 v1 和 v2。
class MainActivity : AppCompatActivity() , AdapterView.OnItemSelectedListener {
var v1 = 0
var v2 = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val datalink1 = "abcdefj.json"
CoroutineScope(Dispatchers.IO).launch() {
val abcd = Fuel.get(datalink1t).awaitString()
if(abcd.equals("c")){
v1++
}
else if(abcd.equals("d")){
v2++
}
我想全局访问在 cooutinscope 内更新的 v1 和 v2,以便我可以在其他活动或适配器类中使用它们。但我只得到初始值 0。我如何将其更新为全局。我是 kotlin 或协程的新手,请帮忙。
或查看以下附加代码简单示例,其中 cooutinScope 块位于 mainActivity kotlin 的 onCreate 方法中。我想在 cooutinscope 内全局更新 k 的值。我想实现在 cooutinscope 中更新 k 值的更新,但在外部访问此更新。但我得到了初始值。任何人都可以帮助如何获得这个简单的问题, 请。我想要在 cooutinscope 中更新并从 cooutinscope 访问之后的 k 4 的值。谢谢
【问题讨论】:
-
没有理由不应该在全球范围内更新这些内容。你如何验证它们不是?
-
可能是线程间可见性问题,标记这两个
vars@Volatile应该使 IO 协程中的更改对其他线程可见。 -
明确 v1 和 v2 的值通常在 HTTP 调用 Fuel.get(datalink1t).awaitString() 后在 cooutinscope 内更新,这没关系。但在 cooutinscope 之外,v1 和 v2 的值仍然为零初始值。如何使用 voltile 你能解释一下吗@George Leung
-
@Tenfour04 你可以在我更新的代码中看到。我只是想表明它不起作用并且没有更新
-
也许您可以分享该代码的示例。 (请粘贴文本,而不是图片。)您上面显示的代码很有意义。在协程完成并从内部记录之前,您可以看到您正在从协程外部记录。但是您可能应该使属性易变或选择一个线程来访问它们。在协程中,您始终可以使用
withContext(Dispatchers.Main) { }包装属性的使用,以确保它们始终只能从主线程访问,就像调用大多数非协程一样。
标签: kotlin asynchronous kotlin-coroutines