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

时间:2012-01-18 09:13:05

标签: android multithreading

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

这是在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();
    }

4 个答案:

答案 0 :(得分:17)

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

HandlerThread有一个内置的quit()quitSafely(API18)方法来停止线程。 https://developer.android.com/reference/android/os/HandlerThread.html#quit()

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

所以要回答,这很简单:

safeThread.quit();

答案 1 :(得分:10)

如果您启动这样的话:

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

最安全的方法是:

thread.quitSafely();

quitSafely 可确保在线程停止之前处理所有待处理的邮件。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我一直在关注:

if (safeHandler!= null) {
     final Looper looper = safeHandler.getLooper();
     looper.quitSafely();
     safeHandler = null;
 }