清理android后台线程,处理程序和looper

时间:2014-12-19 20:18:51

标签: java android multithreading

我正在寻找在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();

这种清理后台线程/处理程序/循环器的方法是否有问题或更好的方法来处理这个问题?

0 个答案:

没有答案
相关问题