Kotlin crea una coroutine personalizada.
Estoy tratando de crear una rutina de coroutine a partir de un método que tengo.
Para simplificar, digamos que tengo una class A
a la que intento connect()
y solo se conecta después de que class B
, que está dentro de A
, se conecta.
Así que tengo este código, por ejemplo, que por supuesto no funciona pero es solo para mostrar mi caso de uso-
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
}
})
}
}
Quiero convertir classB.connect()
en una coroutine, y hacerla suspendida, de modo que solo cuando se complete, se ejecute la línea de val isConnected = classB.isConnected
y se establezca el valor correctamente.
Si usara Java y callbacks, simplemente pasaría un callback al método classB.connect()
y establecería el valor class A.isConnected
dentro de este callback.
¿Es posible con las coroutines de Kotlin?
Gracias.
davy.ai
Sí, es posible usar las corutinas de Kotlin para hacer que
classB.connect()
sea una función suspendida. Aquí hay un ejemplo de cómo puedes hacerlo:En
class A
, hacemos que la funciónconnect()
sea una función suspendida, lo que nos permite usardelay()
ysuspendCoroutine()
para la corutina. InstanciamosclassB
y llamamosclassB.connect()
como una función suspendida, lo que significa queclassA
esperará hasta queclassB
esté conectado antes de continuar. Usamos un buclewhile
condelay(100)
para esperar a que se complete la conexión. Una vez queclassB
esté conectado, establecemosisConnected
entrue
y continuamos la corutina. Si hay un error durante la conexión, continuamos la corutina con una excepción.En
class B
, hacemos queconnect()
sea una función suspensa que devuelveUnit
(es decir,void
). UsamossuspendCoroutine()
para suspender la corutina hasta que se complete la conexión. Pasamos un objeto anónimo deSomeListenerInterface
asomeObject.connect()
para manejar los casos de éxito y error de la conexión. Si la conexión tiene éxito, establecemosisConnected
entrue
y usamoscontinuation.resume(Unit)
para continuar la corutina. Si hay un error durante la conexión, usamoscontinuation.resumeWithException()
para continuar la corutina con una excepción.Tenga en cuenta que
resume()
yresumeWithException()
se usan para continuar la corutina con un valor o una excepción, respectivamente.