【问题标题】:Kotlin create a custom coroutineKotlin 创建自定义协程
【发布时间】:2022-01-05 06:25:19
【问题描述】:

我正在尝试使用我拥有的方法制作协程。 为简单起见,假设我有一个class A,我尝试连接到connect(),并且只有在A 内部的class B 连接后才连接。

所以,例如,我有这个代码,它不能正常工作,但它只是为了展示我的用例-

class A {
    fun connect() {
        classB.connect()
        val isConnected = classB.isConnected
    }
}

class B {
    val isConnected: Boolean = false
    fun connect() {
        someObject.connect( SomeListenerInterface {
            override fun onSuccess() {
                isConnected = true
            }
        })
    }
}

我想把classB.connect()做成协程,让它挂起,所以只有当它完成后,val isConnected = classB.isConnected的行才会执行并且值会被正确设置。

如果我要使用 java 和回调,我只需将回调传递给 classB.connect() 方法,并在此回调中设置 class A.isConnected 值。

kotlin 协程可以吗? 谢谢

【问题讨论】:

  • 您首先需要将基于回调的someObject.connect 函数转换为挂起函数。你可以使用suspendCancellableCoroutine builder 来做到这一点。现在someObject.connect 已挂起,您需要将B.connect 标记为suspend。需要的最后一位是CoroutineScope,它是非协程和基于协程的世界之间的桥梁。由于您没有提供确切的代码并提到它在做什么,因此无法建议协程代码,但我之前写的内容是您需要做的要点。
  • @ArpitShukla 感谢您的建议。我想我会在classB 中使用val ack = CompletableDeferred<Boolean>() 之类的东西,我会在classB.connect()classA.connect() 中写ack.complete(true),我只会在classB.connect() 之后使用classB.await()。你怎么看?
  • @StackerSapper 这是不必要的,你应该按照 Arpit 所说的,这在 Kirill 的回答中有详细说明

标签: kotlin kotlin-coroutines coroutine


【解决方案1】:

使用suspendCoroutine 将回调转换为挂起函数。下面的函数在连接成功时返回true

class B {
    suspend fun connect(): Boolean = suspendCoroutine { continuation ->
        someObject.connect(object : SomeListenerInterface {
            override fun onSuccess() {
                continuation.resume(true)
            }
        })
    }
}

class A 中的connect 函数应分别为suspend

class A {
    suspend fun connect() {
        val isConnected = classB.connect()
    }
}

【讨论】:

  • 谢谢,虽然CompletableDeferred<Boolean>() 的解决方案也不好?因为我有很多相互关联的回调
  • 我依赖于 Kotlin 创始人 Roman Elizarovopinion
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 2012-07-25
  • 2023-03-14
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
相关资源
最近更新 更多