Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问Kotlin中的CoroutinScope中更新的变量_Kotlin_Asynchronous_Kotlin Coroutines - Fatal编程技术网

访问Kotlin中的CoroutinScope中更新的变量

访问Kotlin中的CoroutinScope中更新的变量,kotlin,asynchronous,kotlin-coroutines,Kotlin,Asynchronous,Kotlin Coroutines,我已经全局声明了变量并更新了coroutinScope中的值。当我调用coroutinScope之外的值时,它的值不会更新。如何在外部访问coroutinScop内部更新的值。这是一个例子。在通过HTTP客户端燃料从端点获得一些数据之后,我需要更新变量v1和v2 class MainActivity : AppCompatActivity() , AdapterView.OnItemSelectedListener { var v1 = 0 var v2 = 0 override fu

我已经全局声明了变量并更新了coroutinScope中的值。当我调用coroutinScope之外的值时,它的值不会更新。如何在外部访问coroutinScop内部更新的值。这是一个例子。在通过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++
    }
我想全局访问CoroutingScope内部更新的v1和v2,以便在其他活动或适配器类中使用。但我只得到初始值0。我怎样才能在全球范围内更新它。我是kotlin或coroutine的新手,请帮助我

或者查看以下附带的代码简单示例,其中包含mainActivity kotlin的onCreate方法中的coroutinScope块。我想在协同范围内全局更新k的值。我想实现k值的更新,k值在coroutinscope中更新,但在外部访问此更新。但我得到的是初始值。任何人都可以帮助我们获得这个简单的问题, 请我希望在coroutinscope中更新后得到k4的值,并从coroutinscope中访问。谢谢


协同程序在块内同步运行代码。您可以从日志中看到,在调用协同路由外部的日志之前,会先调用协同路由内部的日志。这就是为什么您只看到初始值


如果您想使用更新后的值,只需在稍微延迟后获取它。到那时,它也是全局设置的。

没有理由不进行全局更新。您如何验证它们是否不存在?可能是线程间可见性问题,标记这两个
var
s
@Volatile
会使IO协程中的更改对其他线程可见。要明确在HTTP调用Fuel.get(datalink1t).waitString()后协程内通常更新的v1和v2值没关系。但在协同范围之外,v1和v2的值仍然是初始值的零。如何使用voltile你能再解释一下吗@GeorgeLeung@Tenfour04你能看到我更新的代码吗。我只是想说明它不工作,也没有更新。也许你可以分享一个代码示例。(请粘贴文本,而不是图片。)上面显示的代码很有意义。您可以看到,在协同程序完成之前,您正在从协同程序外部进行日志记录,并从内部进行日志记录。但是,您可能应该使这些属性不稳定,或者选择一个线程来访问它们。在协同程序中,您可以始终使用
withContext(Dispatchers.Main){}
包装属性的使用,以确保它们始终只能从主线程访问,就像调用大多数非协同程序一样。