Mark
07/06/2020, 2:22 AMContentResolver
you can optionally pass a CancellationSignal
argument. So I would like to call cancel()
on that object when the coroutine is cancelled. Is there a way to do this without using suspendCancellableCoroutine
(since I don’t need the whole resume()
functionality)?
suspendCancellableCoroutine<Result> { continuation ->
val cancellationSignal = CancellationSignal()
continuation.invokeOnCancellation {
cancellationSignal.cancel()
}
val result: Result = resolver.query(args, cancellationSignal)
continuation.resume(result)
}
octylFractal
07/06/2020, 2:23 AMcoroutineContext[Job]!!.invokeOnCompletion
takes an argument to inform you of cancellation as well, could probably use thatMark
07/06/2020, 2:30 AMoctylFractal
07/06/2020, 2:31 AMMark
07/06/2020, 2:34 AMDisposableHandle
suspend inline fun <T> usingCancellationSignal(action: (CancellationSignal) -> T): T {
val cancellationSignal = CancellationSignal()
val disposableHandle = coroutineContext[Job]!!.invokeOnCompletion { cause ->
if (cause is CancellationException) {
cancellationSignal.cancel()
}
}
try {
return action(cancellationSignal)
} finally {
disposableHandle.dispose()
}
}
Mark
07/06/2020, 5:18 AMCancellationSignal.cancel()
is only called when the cause is CancellationException