我有一个使用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));
}
我没有立即关闭线程\处理程序 - 我只是发送一个"最高优先级"消息,因此处理程序可以清理在其线程上创建的内容(例如,断开GoogleApiClient)。
我在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消息,因此只有在处理完消息后(即清理后)才会进行实际的退出。