公司项目用了很多 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)来解决这个问题,我想知道是不是我打开方式不对?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://v2ex.xtra.eu.org/t/295032
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.