- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我使用 GlobalLayoutListener
查看 softKeyboard 是否打开时,该 fragment 在被销毁后不再被垃圾回收。
我的工作:
onDestroy()
中删除了监听器onDestroy()
中将 Listener 设置为 null
onDestroy()
仍然泄漏 fragment 。
有没有人遇到过类似的问题并且知道解决方法??
我的onDestroy
:
@Override
public void onDestroy(){
Log.d(TAG , "onDestroy");
if(Build.VERSION.SDK_INT < 16){
view.getViewTreeObserver().removeGlobalOnLayoutListener(gLayoutListener);
}else{
view.getViewTreeObserver().removeOnGlobalLayoutListener(gLayoutListener);
}
view = null;
gLayoutListener = null;
super.onDestroy();
}
最佳答案
我强烈认为在 onDestroy
() 中删除由 View 对象引用的 Listener 为时已晚。此覆盖方法发生在 onDestroyView
() 之后,它应该“...清理与其 View 关联的资源”。您可以在 onStop()
中使用相同的代码。虽然我没有使用这种技术。
我可以推荐这段代码,我使用它时调试器没有任何问题。
// Code below is an example. Please change it to code that is more applicable to your app.
final View myView = rootView.findViewById(R.id.myView);
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi") @SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
// Obtain layout data from view...
int w = myView.getWidth();
int h = myView.getHeight();
// ...etc.
// Once data has been obtained, this listener is no longer needed, so remove it...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
myView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
else {
myView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
注意事项:
getViewTreeObserver
用于布局,通常您只需要短时间使用此监听器。因此立即删除监听器。removeOnGlobalLayoutListener
() 应该被 Studio 划掉,因为它在 JELLY_BEAN 之前不可用。@SuppressWarnings("deprecation")
。myView = rootView.findViewById(R.id.myView);
可能需要更改为更适用于您的应用或情况的代码。关于android - view.getViewTreeObserver().addOnGlobalLayoutListener 泄漏 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28264139/
为什么我们要使用ViewTreeObserver,谁能解释一下? 在下面的代码中,creditsView 是 TextView 对象。通过这整个代码,我明白“这是根据条件隐藏一些文本”,但唯一的问题是
我们知道ViewTreeObserver用于注册可以通知 View 树中全局更改的监听器。这个类中定义了两个方法addOnGlobalLayoutListener(ViewTreeObserver.O
当我使用 GlobalLayoutListener 查看 softKeyboard 是否打开时,该 fragment 在被销毁后不再被垃圾回收。 我的工作: 我在 fragment 的 onDestr
问题:假设我们有一个简单的案例:我们有 View ,我们必须在这个 View 上显示一些数据。我们使用静态方法 showData(View view) 来做到这一点。我想知道测量 View 布局的确切
我是一名优秀的程序员,十分优秀!