又研究了一阵,看了一些开源项目的代码还有Android的一些源码,我发现这个问题其实是有手动解决的办法。
可以先看看这个问题http://stackoverflow.com/questions/26369905/activitys-ondestroy-fragments-ondestroyview-set-null-practices
对于Activity来说,OnDestory就真Destory了,不会有这个问题。但是对于Fragment来说,平时我们把它放到Backstack里面的时候,只有View是销毁的,非View的部分是会保留的。这就造成了Adapter不会被自动释放,从而导致RecyclerView不被释放。
解决方法从两个思路入手:
在OnDestoryView里,不仅把RecyclerView设为null,同时手动把Adapter设为null,这样就强制断开了Fragment对Adapter的引用。这个方法的缺点是你需要在OnCreateView里面重新初始化Adapter(以前我们可以在OnCreate里面初始化)。其实这样对性能影响并不会很大,因为Adapter一般比较轻量。这种思路可以在这里看到(链接过去的是一个比较出名的Android库)。
在Fragment里面不保留Adapter的引用。也就是说Adapter是个本地变量,直接创建好了马上传给RecyclerView。之后如果要用就通过RecyclerView去拿就好了。这种方法其实和上面那种很像,只是不需要手动管理引用了。同样是因为没有引用,所以每次创建RecyclerView的时候也要重新创建Adapter。这种思路在Android自己实现的PreferenceFragmentCompat里面可以看到。
以上两种方法都需要重新创建Adapter,但是都能解决内存溢出问题。想到之前看过的一篇文章说Fragment是Android里面最蛋疼的东西。。。有点后悔用 One Activity + Multiple Fragments这种架构了。。。
1
a0000 2016-07-26 17:30:21 +08:00
fragment 总有被销毁的时候吧
|
2
iluhcm 2016-07-27 12:24:28 +08:00
我是能不用 Fragment 就不用 Fragment 。。
|
3
torchmu 2016-07-27 14:24:25 +08:00 1
单个 Activity 风险太大了, Fragment 主要是适配不同屏幕、共用组件、插件化来使用,其他还是用 Activity 吧。
|