我总是创建两个处理程序:一个在主线程上包装,另一个在单个线程上包装。
这是在活动生命周期中启动和停止它们的最佳方法吗?
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();
}发布于 2012-01-18 17:40:34
您可以使用此方法作为停止线程的安全方法:
if (safeThread!= null) {
safeThread.quit();
safeThread = null; // Object is no more required.
}您也可以使用safeThread.quitsafely。
发布于 2014-03-04 22:21:10
我知道这是一个有点老的问题,但是我在寻找同样的答案时偶然发现了这个问题,并进行了进一步的研究。我不相信目前的答案适用于HandlerThread (尽管对于正常的线程来说绝对正确)。
HandlerThread有一个内置的quit()和quitSafely(API18)方法来停止线程。https://developer.android.com/reference/android/os/HandlerThread.html#quit()
两者之间的区别仅在于队列中的消息是否会在其停止之前被处理。
所以要回答这个问题,很简单:
safeThread.quit();发布于 2015-08-12 04:24:18
如果像这样启动线程:
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();阻止它的最安全的方法是:
thread.quitSafely();quitSafely可确保在线程停止之前处理所有挂起的消息。
注意:我最初的回答包括一个对thread.join的额外调用,但我发现join调用在quitSafely之后使用时不能可靠地释放。
https://stackoverflow.com/questions/8907626
复制相似问题