Mark
ContentResolver
CancellationSignal
cancel()
suspendCancellableCoroutine
resume()
suspendCancellableCoroutine<Result> { continuation -> val cancellationSignal = CancellationSignal() continuation.invokeOnCancellation { cancellationSignal.cancel() } val result: Result = resolver.query(args, cancellationSignal) continuation.resume(result) }
octylFractal
coroutineContext[Job]!!.invokeOnCompletion
DisposableHandle
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() } }
CancellationSignal.cancel()
CancellationException
A modern programming language that makes developers happier.