我正在寻找在android中清理后台线程的最佳方法。我通过以下方式创建线程:
Thread backgroundThread = new Thread(new Runnable () {
public void run () {
Looper.prepare();
backgroundHandler = new Handler();
backgroundHandler.post(new Runnable() {
public void run () {
....
}
});
Looper.loop();
}
});
似乎调用Looper.quitSafely()是在Android 18+版本中为gc清理所有内容的方法,但是我还没有找到适合旧版Android的好方法。在android 18之前,唯一的选择是Looper.quit()方法根据文档“不安全”。 http://developer.android.com/reference/android/os/Looper.html#quit() http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages(java.lang.Object)
我最近尝试解决这个问题的方法是:
if (Build.VERSION.SDK_INT >= 18) {
backgroundHandler.getLooper().quitSafely();
} else {
backgroundHandler.removeCallbacksAndMessages(null);
backgroundHandler.getLooper().quit();
}
backgroundHandler = null;
但是在运行测试时我一直在收到警告:
W/MessageQueue﹕ Handler{40593dd8} sending message to a Handler on a dead thread
java.lang.RuntimeException: Handler{40593dd8} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196)
at android.os.Handler.sendMessageAtTime(Handler.java:457)
at android.os.Handler.sendMessageDelayed(Handler.java:430)
at android.os.Handler.sendMessage(Handler.java:367)
at android.media.MediaPlayer.postEventFromNative(MediaPlayer.java:1522)
at dalvik.system.NativeStart.run(Native Method)
我认为我的测试可能存在问题,因为我正在测试很多在后台线程上运行的东西(异步。)我使用CountDownLatch来等待异步代码完成运行(回调)在结束测试之前,我可能会遗漏一些东西。
这让我质疑以下代码:
backgroundHandler.removeCallbacksAndMessages(null);
backgroundHandler.getLooper().quit();
这种清理后台线程/处理程序/循环器的方法是否有问题或更好的方法来处理这个问题?