我使用以下代码检测键盘是否在活动的整个生命周期中显示:
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就足够了吗?
答案 0 :(得分:1)
在销毁Activity
后,您不需要删除引用 - 视图将不再使用,并将与您的侦听器一起进行垃圾回收。但是,如果您因某些其他原因需要删除它,请不要保留对ViewTreeObserver
的引用 - 在您需要时从View
获取引用。也就是说,保留对root
的引用,并且当您想要删除侦听器时,请调用root.getViewTreeObserver().removeGlobalOnLayoutListener(keyboardListener)
。 ViewTreeObserver
root
上的View
实例可能会被替换,因此您可能会有陈旧的引用。