如何解决Android拖放内存泄漏
我有一个内存泄漏,这是我在日志行第一次看到的:资源无法调用release。
我安装了LeakCanary以查看是否可以找到它,并告诉我它是
├─ android.widget.FrameLayout instance
D/LeakCanary: │ Leaking: NO (View attached)
D/LeakCanary: │ View is part of a window view hierarchy
D/LeakCanary: │ View.mAttachInfo is not null (view attached)
D/LeakCanary: │ View.mID = R.id.nav_host_fragment
D/LeakCanary: │ View.mWindowAttachCount = 1
D/LeakCanary: │ mContext instance of com.salinas.builder.MainActivity with mDestroyed = false
D/LeakCanary: │ ↓ FrameLayout.mCurrentDragChild
D/LeakCanary: │ ~~~~~~~~~~~~~~~~~
D/LeakCanary: ╰→ androidx.constraintlayout.widget.ConstraintLayout instance
我不确定我是否正确理解了这一点,似乎mCurrentDragChild在某种程度上是原因,而我没有办法实现这一点。我查看了源代码,看不到如何做才能将此值设置为任何值。它在ViewGroup中作为View实例变量,并且没有对onDestroyView的调用。
似乎没有其他人遇到这个问题,所以我认为我做错了其他事情。
我的Drag侦听器是:
v.setOnDragListener(new View.OnDragListener(){
@Override
public boolean onDrag(View v,DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// do nothing
break;
case DragEvent.ACTION_DRAG_ENTERED:
v.setBackground(enterShape);
break;
case DragEvent.ACTION_DRAG_EXITED:
v.setBackground(normalShape);
break;
case DragEvent.ACTION_DROP:
v.setBackground(normalShape);
View view = (View) event.getLocalState();
if (view instanceof NeighborLayout) {
dropNeighbor(view);
} else if (view instanceof RegionLayout){
dropFamily(view);
}
break;
case DragEvent.ACTION_DRAG_ENDED:
if (! event.getResult()){
View w = (View) event.getLocalState();
w.setVisibility(View.VISIBLE);
}
break;
default:
break;
}
return true;
}
});
我需要做些什么来了解正在发生的事情以及如何解决它吗?
编辑 我做了一些进一步的工作,试图了解正在发生的事情。 如果我没有将拖放操作放到放置目标中,则结果与我放置时的结果相同,但仍显示失败释放消息。 LeakCanary告诉我我有泄漏。
如果我执行了拖放操作,则不会显示该消息,并且LeakCanary处于安静状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。