Java 清理android后台线程、处理程序和循环器
我正在寻找最好的方法来清理android中的背景线程。我通过以下方式创建线程:Java 清理android后台线程、处理程序和循环器,java,android,multithreading,Java,Android,Multithreading,我正在寻找最好的方法来清理android中的背景线程。我通过以下方式创建线程: Thread backgroundThread = new Thread(new Runnable () { public void run () { Looper.prepare(); backgroundHandler = new Handler(); backgroundHandler.post(new Runnable(
Thread backgroundThread = new Thread(new Runnable () {
public void run () {
Looper.prepare();
backgroundHandler = new Handler();
backgroundHandler.post(new Runnable() {
public void run () {
....
}
});
Looper.loop();
}
});
在android 18+版本中,调用Looper.quitsafety()似乎是为gc清理一切的方法,但我还没有为旧版本的android找到一个好的解决方案。在android 18之前,唯一的选择是Looper.quit()方法,根据文档,它是“不安全的”。
我最近尝试解决这个问题的方法是:
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();
这种清理后台线程/处理程序/循环器的方法有问题吗?或者有更好的方法来处理这个问题吗 我认为真正的问题是你所说的清理是什么意思。垃圾收集器自动工作,您不必自己释放资源。话虽如此,
线程只有在不再运行时才会被垃圾收集。因此,一旦线程自行停止或在您取消它之后,它将被垃圾收集。请注意,虽然不能解决您的问题,但它确实为您完成了所有样板线程+循环器的工作。@XaverKapeller所说的清理,我指的是停止循环器,以便线程停止并被垃圾收集