Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在退出线程之前,安全地将最后一个任务发布到处理程序_Android_Multithreading - Fatal编程技术网

Android 在退出线程之前,安全地将最后一个任务发布到处理程序

Android 在退出线程之前,安全地将最后一个任务发布到处理程序,android,multithreading,Android,Multithreading,我有一个后台处理程序和相关的HandlerThread val handlerThread = HandlerThread("my background thread").apply { start() } val handler= Handler(handlerThread) 当退出此类的生命周期时,我想清理后台线程中的一些内容。所以我发布了一个runnable来清理它,然后调用handlerThread.quitsafety(): 但我得到了LogCat警告“向死线程上的处理程序发送消息”

我有一个后台处理程序和相关的HandlerThread

val handlerThread = HandlerThread("my background thread").apply { start() }
val handler= Handler(handlerThread)
当退出此类的生命周期时,我想清理后台线程中的一些内容。所以我发布了一个runnable来清理它,然后调用
handlerThread.quitsafety()

但我得到了LogCat警告“向死线程上的处理程序发送消息”,并且从未调用
someObject.release()

quitsafety()
应该仅在处理完所有消息后停止线程,而不是延迟消息。查看源代码,我看到
handler.post
以0的延迟发布runnable,所以我猜这意味着它还没有在队列中,并且
quitsafety()
不会等待它发布吗


在发布之前,在后台线程中再运行一个clean-up runnable的正确方法是什么?它是否可以像包装
handlerThread.QuitSafety()
到runnable中一样简单,并在后台清理runnable结束时将其发布到主处理程序?

这就是我最后要做的,它似乎工作得很好

fun onDestroy() {
    handler.post {
        someObject.release()
        handlerThread.quitSafely()
    }
}

所以你应该调用HandlerThread.quitSafety()。。。从
手柄线程
?我必须承认,我希望有一个更好的解释这个问题。。。☹
fun onDestroy() {
    handler.post {
        someObject.release()
        handlerThread.quitSafely()
    }
}