原生的 RecyclerView 真的没有 memory leak 么?

2016-07-26 15:07:40 +08:00
 kitalphaj
公司项目用了很多 RecyclerView ,然后发现有内存泄漏的情况。找问题的时候顺便看了一下 RecyclerView 的源码( Android Studio 反编译的吧应该是,不保证正确性),发现在注册 setAdapter 的时候用了 Observable Pattern 。

大概就是 RecyclerView 里面有个 inner class 是 Observer 用来观察 Adapter 的数据变化。因为用的是非静态内部类,这个 Observer 和这个 RecyclerView 就会有互相引用。这个不是问题的关键因为一旦 RecyclerView 没有 Activity 或者 Fragment 引用了就会一起回收。

问题是,这个 Adapter 里面的 Observable 也是个内部类,而 Observable 会把传进来的 Observer 存起来。这样的话,如果我 Adapter 放在一个 Fragment 里面,然后这个 Fragment 放到 Backstack 里面去的时候 Adapter 本身应该是不会销毁的( onDestoy 没有调用),这样的话 RecyclerView 也不会被回收(尽管 onDestroyView 调用了)。

我目前是用了 RecyclerView.setAdapter(null)来解决这个问题,我想知道是不是我打开方式不对?
13669 次点击
所在节点    Android
4 条回复
a0000
2016-07-26 17:30:21 +08:00
fragment 总有被销毁的时候吧
iluhcm
2016-07-27 12:24:28 +08:00
我是能不用 Fragment 就不用 Fragment 。。
torchmu
2016-07-27 14:24:25 +08:00
单个 Activity 风险太大了, Fragment 主要是适配不同屏幕、共用组件、插件化来使用,其他还是用 Activity 吧。
kitalphaj
2016-07-27 15:30:13 +08:00
@torchmu 我这叫不入坑不知道坑大。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295032

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX