【问题标题】:Access the variable updated in CoroutinScope in Kotlin在 Kotlin 的 CooutinScope 中访问更新的变量
【发布时间】: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


【解决方案1】:

协程在块内异步运行您的代码。您可以从日志中看到,协程外部的日志记录是在协程内部的日志记录之前调用的。这就是为什么您只能看到初始值。

如果你想使用更新后的值,你只需要稍等片刻就可以得到它。到时候也是全局设置的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多