Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 清理android后台线程、处理程序和循环器_Java_Android_Multithreading - Fatal编程技术网

Java 清理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(

我正在寻找最好的方法来清理android中的背景线程。我通过以下方式创建线程:

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所说的清理,我指的是停止循环器,以便线程停止并被垃圾收集