My app is composed of a single Activity
. In this activity, I\'m creating multiple HandlerThread
s which run in a loop to do socket blocking operations.<
Yes, it would be a good idea to close it. Also make sure to remove your callbacks.
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
handler.getLooper().quit();
}
/**
* 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;
}
Above is the 'quit' method of the source code of HandlerThread.java, just invoke it directly.
Why should called quit? Below is 'run' method of the source code of HandlerThread.java.
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;
}
The answer is 'loop is a 'while(true)' method,It will return until receive a Message with null target.
The HandlerThread is stopped when the Looper is quitted. HandlerThread.getLooper().quit() when you stop your activity. (see 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 for a good example of a proper HandlerThread use)
The best practices approach would be to remove the callbacks to your handlers in your activities onDestroy()
. See this answer for more:
https://stackoverflow.com/a/5038542/1369222