У меня есть сценарий использования, когда мне нужно подключиться и отключиться от класса, который действует как служба.Действия могут быть выполнены над сервисом только тогда, когда сервис подключен.Клиенты получают уведомление, когда служба подключается или отключается с помощью обратного вызова:
class Service {
constructor(callback: ConnectionCallback) { ... }
fun connect() {
// Call callback.onConnected() some time after this method returns.
}
fun disconnect() {
// Call callback.onConnectionSuspended() some time after this method returns.
}
fun isConnected(): Boolean { ... }
fun performAction(actionName: String, callback: ActionCallback) {
// Perform a given action on the service, failing with a fatal exception if called when the service is not connected.
}
interface ConnectionCallback {
fun onConnected() // May be called multiple times
fun onConnectionSuspended() // May be called multiple times
fun onConnectionFailed()
}
}
Я хотел бы написать оболочку для этого класса Service
(который я не контролирую) с помощью Kotlin Coroutines.Вот скелет из ServiceWrapper
:
class ServiceWrapper {
private val service = Service(object : ConnectionCallback { ... })
fun connect() {
service.connect()
}
fun disconnect() {
service.disconnect()
}
suspend fun performActionWhenConnected(actionName: String): ActionResult {
suspendUntilConnected()
return suspendCoroutine { continuation ->
service.performAction(actionName, object : ActionCallback() {
override fun onSuccess(result: ActionResult) {
continuation.resume(result)
}
override fun onError() {
continuation.resumeWithException(RuntimeException())
}
}
}
}
}
Как я могу реализовать это suspendUntilConnected()
поведение с помощью сопрограмм?Заранее спасибо.