From 562a9f26f1fcbe354290f544385701b096c0c9e7 Mon Sep 17 00:00:00 2001 From: Mygod Date: Sat, 4 Jul 2020 07:48:56 +0800 Subject: [PATCH] Support cancelling RootCommand --- .../be/mygod/librootkotlinx/RootServer.kt | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt b/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt index 2dce740d..9e112f77 100644 --- a/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt +++ b/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt @@ -420,14 +420,20 @@ class RootServer @JvmOverloads constructor(private val warnLogger: (String) -> U Log.e(command.javaClass.simpleName, "Unexpected exception in RootCommandOneWay", e) } } - is RootCommand<*> -> defaultWorker.launch { - val result = try { - val result = command.execute(); - { output.pushResult(callback, result) } - } catch (e: Throwable) { - { output.pushThrowable(callback, e) } + is RootCommand<*> -> { + val commandJob = Job() + cancellables[callback] = { commandJob.cancel() } + defaultWorker.launch(commandJob) { + val result = try { + val result = command.execute(); + { output.pushResult(callback, result) } + } catch (e: Throwable) { + { output.pushThrowable(callback, e) } + } finally { + cancellables.remove(callback) + } + withContext(callbackWorker) { result() } } - withContext(callbackWorker) { result() } } is RootCommandChannel<*> -> defaultWorker.launch { val result = try {