【发布时间】: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函数转换为挂起函数。你可以使用suspendCancellableCoroutinebuilder 来做到这一点。现在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