首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是停止handlerthread的完美方式吗?

这是停止handlerthread的完美方式吗?
EN

Stack Overflow用户
提问于 2012-01-18 17:13:05
回答 4查看 22.6K关注 0票数 14

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

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

代码语言:javascript
运行
复制
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();
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-18 17:40:34

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

代码语言:javascript
运行
复制
 if (safeThread!= null) {
     safeThread.quit();
     safeThread = null; // Object is no more required.
 }

您也可以使用safeThread.quitsafely

票数 1
EN

Stack Overflow用户

发布于 2014-03-04 22:21:10

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

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

两者之间的区别仅在于队列中的消息是否会在其停止之前被处理。

所以要回答这个问题,很简单:

代码语言:javascript
运行
复制
safeThread.quit();
票数 23
EN

Stack Overflow用户

发布于 2015-08-12 04:24:18

如果像这样启动线程:

代码语言:javascript
运行
复制
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

阻止它的最安全的方法是:

代码语言:javascript
运行
复制
thread.quitSafely();

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

注意:我最初的回答包括一个对thread.join的额外调用,但我发现join调用在quitSafely之后使用时不能可靠地释放。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8907626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档