处理程序是否可以自行退出?

时间:2015-11-21 20:21:15

标签: android multithreading service handler

我有一个使用Handler创建后台HandlerThread的服务:

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate");

    HandlerThread thread = new HandlerThread("ReportServiceBackgroundThread", Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();

    mReportServiceHandler = new ReportServiceHandler(thread.getLooper());
}

其中ReportServiceHandler扩展了Handler并覆盖handleMessage(Message msg)(我个人更喜欢在线程之间处理消息而不是发布Runnables,因为它感觉更安全)。

当服务即将被销毁时,我会这样做:

@Override
public void onDestroy() {
    Log.d(TAG, "onDestroy");
    mReportServiceHandler.sendMessageAtFrontOfQueue(mReportServiceHandler.obtainMessage(REPORT_SERVICE_DESTROY));
}

我没有立即关闭线程\处理程序 - 我只是发送一个"最高优先级"消息,因此处理程序可以清理在其线程上创建的内容(例如,断开Goog​​leApiClient)。

我在handleMessage函数中捕获REPORT_SERVICE_DESTROY消息:

@Override
public void handleMessage(Message msg) {
    ...
    switch (msg.what) {
        ...
        case REPORT_SERVICE_DESTROY:
            ... // cleanup code
            ReportServiceHandler.this.removeCallbacksAndMessages(null);
            ReportServiceHandler.this.getLooper().quitSafely();
            break;
    }
}

可以从线程\处理程序本身调用quitSafely吗?在大多数示例中,我看到quit是从处理程序外部调用的,如果您没有任何要清理的话,这是有意义的。

由于

--- 编辑 --- 另一种解决方案是从quitSafely中移除handleMessage并执行:

@Override
public void onDestroy() {
    Log.d(TAG, "onDestroy");
    mReportServiceHandler.sendMessageAtFrontOfQueue(mReportServiceHandler.obtainMessage(REPORT_SERVICE_DESTROY));
    mReportServiceHandler.getLooper().quitSafely();
}

关注quitSafely的{​​{3}}:

  

一旦处理了已经发送的消息队列中的所有剩余消息,就会使loop()方法终止。

由于我们刚刚添加了REPORT_SERVICE_DESTORY消息,因此只有在处理完消息后(即清理后)才会进行实际的退出。

0 个答案:

没有答案