Fragment内存泄漏问题

883 阅读1分钟

项目使用的是MVVM框架,集成leak后,连续多次点击显示关闭某个页面,会报内存问题。

leak内存泄漏路径

activity--->fragmentManager--->fragmentMangerImpl---->fragment--->fragment.view。 androidx.constrainlayout.widget.Constraintlayout leaking:YES 泄漏路径最后指向fragment view泄漏。

分析过程

1 多次点击软件,复现leak报内存问题,尝试从leak泄漏提示信息分析。

--从提示信息上,找不到具体切入点,猜测跟view相关。

2 排除fragment view泄漏原因,是否不正确使用导致view没有被释放。

--查看onDestory方法,binding有解绑、viewmodel有释放,但onDestory未调用,说明fragment未释放。
将onDestory代码挪到onDestoryView方法提前执行,leak还是会报内存问题。
在onDestoryView方法置空使用的view,运行之后多次点击不再报leak问题。

2 android strudio profile观察内存变化。

--内存中fragment持续增多,如显示关闭30次页面,则内存有30个fragment,相关的view、viewmodel也有多个。

解决方案

1 onDestoryView方法,binding解除绑定、viewmode释放、view置空,可以解决leak报内存问题,但并不是最终方案。

2 addFragment时不执行addToBackStack,不加入回退栈中,fragment可正常回收,从而解决内存问题。 根本原因addToBackStack会将fragment记录回退栈中,为fragment提供back回退功能,从而导致fragment无法回收。