Return CoroutineScope 中伴随对象函数中的字符串

Return a String inside the companion object function inside the CoroutineScope

在 MainActivity 中有一个伴随对象函数,它使用函数外部的变量。在函数中,我想 return 数据作为 CoroutineScope 内的字符串。这是代码:-

class MainActivity : AppCompatActivity() {
    private var data = “myName”
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val data = getMyOuterValue()
        Toast.makeText(this@MainActivity, data, Toast.LENGTH_SHORT).show()
    }
    init {
        instance = this
    }
    companion object {
        private var instance: MainActivity? = null
        fun getMyOuterValue() : String = CoroutineScope(Main).launch {
            instance?.data.toString()
        }.toString()
    }
}

注意在函数“getMyOuterValue”中我想 return 字符串,但它 return 是 CoroutineScope 对象。请协助

fun getMyOuterValue() : String = CoroutineScope(Main).launch

在这里你试图强制函数 return 一个字符串,而它应该 return 一个协程作业

然后您使用 .toString() 强制执行此操作以避免类型不匹配。

无论此设置的目的如何,如果您想 return 来自协程内部的值;您可以改用 async 构建器;这需要使用挂起函数来利用 await() 方法。

你的函数应该是:

suspend fun getMyOuterValue() = CoroutineScope(Main).async {
    return@async instance?.data
}.await()

作为挂起的乐趣,对它的调用必须来自协程:

CoroutineScope(Main).launch {
    val data = getMyOuterValue()
    Toast.makeText(this@MainActivity, data, Toast.LENGTH_SHORT).show()
}

问题是您没有正确返回它并且没有等待协程完成。试试这个

 fun getMyOuterValue() = CoroutineScope(Dispatchers.IO).async {
        return@async instance?.data.toString()

    }

在oncreate()中

CoroutineScope(Dispatchers.IO).launch {
        val data = getMyOuterValue()
        data.await()

}