同步和withContext

问题描述

我有以下课程:

class SdkWrapper(private val sdk: Sdk) {

    private var inited = false

    suspend fun doSomething() = withContext(Dispatchers.IO) {
        if (inited.not()) init()
        useSdk()
    }
        
    private fun init() {
        // takes a long time
        sdk.init()
        inited = true
    }

    // has to be done asynchronously
    // sdk.init() has to have been called before using this
    private fun useSdk() {

    }

}

class Sdk {
    // must only be done once
    fun init() {}
}

在执行useSdk()之前,我必须先致电sdk.init(),但是sdk.init()只能被调用一次,不能再被调用。

在我当前的解决方案中,如果doSomething被快速调用两次(第二次发生在sdk.init()仍在运行时),我会两次调用sdk.init(),因为inited: Boolean是仍然false

如果我将inited的分配上调为:

private fun init() {
    inited = true
    sdk.init()
}

doSomething()被快速调用两次,第二次调用将在完成其init()之前使用sdk。

我试图用以下方法解决这个问题:

suspend fun doSomething() = synchronized(this){
    withContext(Dispatchers.IO) {
        if (inited.not()) init()
        useSdk()
    }
}

但是在IntelliJ中收到错误:

withContext悬浮点位于关键部分

我认为synchronized在这里还是行不通的,因为我们移出了主线程,并且doSomething()withContext块仍在运行时完成了吗?

我该如何解决基本上是doSomething()一次只能运行一次的问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)