我的应用由一个Activity
组成。在这个活动中,我正在创建多个HandlerThread
,它们在循环中运行以执行套接字阻塞操作。
目前,我在HandlerThread
期间向这些Activity.onDestroy()
的所有人发送了退出邮件。
有时,当我打开我的应用程序,关闭它并重新启动它时,它会崩溃(很多时候是因为向未运行的处理程序线程发送消息)。
我的问题是:关闭我的应用时关闭HandlerThread
的正确方法是什么?(请注意,这些线程可能在套接字操作上被阻止)。
编辑:更多信息: 我有一个在onCreate中启动的Handler Threads池(当我第一次启动我的应用程序时没问题。)
每个处理程序的runnable循环都包含一个
if (shouldRun) {
//body
}
else {
close();
}
语句。
close方法删除所有待处理的消息和runnables,并向处理程序发送一条消息,使其调用looper.quit()
。
这样,如果当前处理程序线程被IO操作阻止,只有一旦它完成它,他将退出()。
答案 0 :(得分:3)
是的,关闭它是个好主意。还要确保删除回调。
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
handler.getLooper().quit();
}
答案 1 :(得分:1)
答案 2 :(得分:0)
最佳做法方法是删除活动onDestroy()
中处理程序的回调。有关更多信息,请参阅此答案:
答案 3 :(得分:0)
当Looper退出时,HandlerThread停止。停止活动时,HandlerThread.getLooper()。quit()。 (有关使用HandlerThread的正确例子,请参阅http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/app/IntentService.java#IntentService.ServiceHandler.%3Cinit%3E%28android.os.Looper%29)
答案 4 :(得分:0)
/**
* Ask the currently running looper to quit. If the thread has not
* been started or has finished (that is if {@link #getLooper} returns
* null), then false is returned. Otherwise the looper is asked to
* quit and true is returned.
*/
public boolean quit() {
Looper looper = getLooper();
if (looper != null) {
looper.quit();
return true;
}
return false;
}
上面是HandlerThread.java源代码的'quit'方法,只是直接调用它。
为什么要叫退出?下面是HandlerThread.java源代码的'run'方法。
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();//always loop except for a Message with null target
mTid = -1;
}
答案是'loop is a'while(true)'方法,它将返回,直到收到一个带有null target的Message。