这是一种停止处理的完美方式吗?

问题描述 投票:11回答:4

我总是创建两个处理程序:一个是包装在主线程上,另一个是包装在一个线程上。

这是在Activity生命周期中启动和停止这些的最佳方法吗?

HandlerThread safeThread = null;
Handler safeHandler = null;
Handler handler = null;


@Override
    public void onStart() {

if (safeThread == null) {
            safeThread = new HandlerThread("safeThread");
            safeThread.start();
            safeHandler = new Handler(safeThread.getLooper());
        } else if (safeThread.getState() == Thread.State.NEW) {
            safeThread.start();
            safeHandler = new Handler(safeThread.getLooper());
        } else if (safeThread.getState() == Thread.State.WAITING) {
            safeHandler = new Handler(safeThread.getLooper());
        } else if (safeThread.getState() == Thread.State.TERMINATED) {
            safeThread = null;
            safeThread = new HandlerThread("safeThread");
            safeThread.start();
            safeHandler = new Handler(safeThread.getLooper());
        }
}




protected void onStop() {
        Log.d("x", "onStop is executed");
        safeHandler = null;
        safeThread.quit();
        safeThread.interrupt();
        safeThread = null;
        super.onStop();
    }
android multithreading
4个回答
1
投票

您可以使用它作为停止线程的安全方法:

 if (safeThread!= null) {
     Thread moribund = safeThread;
     safeThread = null;
     moribund.interrupt();
 }

17
投票

我知道这是一个有点老问题,但我偶然发现它寻找相同的答案并进一步研究我不相信当前的答案非常适用于HandlerThread(尽管对于普通线程绝对正确)

HandlerThread有一个内置的qazxsw poi和qazxsw poi(API 18)方法来阻止线程。 quit()

两者之间的区别仅在队列中的消息在停止之前处理之前。

所以要回答,这很简单:

quitSafely

10
投票

如果您启动这样的线程:

https://developer.android.com/reference/android/os/HandlerThread.html#quit()

最安全的方法是:

safeThread.quit();

quitSafely确保在线程停止之前处理所有挂起的消息。

注意:我的原始答案包括对thread.join的额外调用,但我发现在quitSafely之后使用时,join调用无法可靠地释放。


0
投票

我一直在关注这个:

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
© www.soinside.com 2019 - 2024. All rights reserved.