删除OnGlobalLayoutListener

时间:2014-12-19 23:02:13

标签: android android-softkeyboard

我使用以下代码检测键盘是否在活动的整个生命周期中显示:

rootVTO = root.getViewTreeObserver();
    keyboardListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (root.getRootView().getHeight() - root.getHeight() > 150) {
                // Keyboard showing
                isKeyboardShowing = true;
            } else {
                // Keyboard not showing
                isKeyboardShowing = false;
            }

            refreshLayout();
        };
    };
    rootVTO.addOnGlobalLayoutListener(keyboardListener);

我尝试在onPause()方法中删除侦听器但是获取消息:

Caused by: java.lang.IllegalStateException: This ViewTreeObserver is not alive, call getViewTreeObserver()

如果我不删除监听器,是否会出现内存泄漏?如果是的话我应该何时将其删除?仅将侦听器设置为null就足够了吗?

1 个答案:

答案 0 :(得分:1)

在销毁Activity后,您不需要删除引用 - 视图将不再使用,并将与您的侦听器一起进行垃圾回收。但是,如果您因某些其他原因需要删除它,请不要保留对ViewTreeObserver的引用 - 在您需要时从View获取引用。也就是说,保留对root的引用,并且当您想要删除侦听器时,请调用root.getViewTreeObserver().removeGlobalOnLayoutListener(keyboardListener)ViewTreeObserver root上的View实例可能会被替换,因此您可能会有陈旧的引用。