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

rex*_*rex 11 multithreading android

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

这是在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();
    }
Run Code Online (Sandbox Code Playgroud)

Bud*_*ius 18

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

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

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

所以要回答,这很简单:

safeThread.quit();
Run Code Online (Sandbox Code Playgroud)

  • 在api 18之前做什么? (2认同)

Sha*_*ley 10

如果您启动这样的线程:

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
Run Code Online (Sandbox Code Playgroud)

最安全的方法是:

thread.quitSafely();
Run Code Online (Sandbox Code Playgroud)

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

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


Tof*_*mad 1

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

 if (safeThread!= null) {
     safeThread.quit();
     safeThread = null; // Object is no more required.
 }
Run Code Online (Sandbox Code Playgroud)

safeThread.quitsafely您也可以使用。

  • 你能解释更多细节吗?是什么原因? (2认同)