RecyclerView 多重嵌套有时候是很常见的用法,但是lz在这里发现了一个惊人的bug,导致oom。
当Recyclerview 外部嵌套了一层可滑动布局时,lz表示我发现一个大的bug,当RecyclerView 外层嵌套滑动布局时
RecyclerView 的回收复用机制将失效,lz亲测 当外层是滑动布局时 RecyclerView 的Adapter 中的 item 滑出屏幕以及
item 的回收方法将不再调用。
下面我们看看为什么会产生这个问题。
第一先了解小RecycleView 的执行顺序:
getItemViewType(获取显示类型,返回值可在onCreateViewHolder中拿到,以决定加载哪种ViewHolder)
onCreateViewHolder(加载ViewHolder的布局)
onViewAttachedToWindow(当Item进入这个页面的时候调用)
onBindViewHolder(将数据绑定到布局上,以及一些逻辑的控制就写这啦)
onViewDetachedFromWindow(当Item离开这个页面的时候调用)
onViewRecycled(当Item被回收的时候调用)
当item不可见时会先调用onViewDetachedFromWindow这方法,紧接着回收时会调用onViewRecycled这方法,但是
lz在这两个方法中打印了日志发现这两个方法并没有被执行。可是这是为什么呢。
RecyclerView默认是setNestedScrollingEnabled(true),是支持嵌套滚动的,也就是说当它嵌套在NestedScrollView中时,默认会随着NestedScrollView滚动而滚动,放弃了自己的滚动
这就导致了一个问题 RecycleView加载更多时上部已近绘制的布局将占据布局中的位置且不能回收,因此在数据非常多的情况下会出现oom,因为一直往下滑的情况下item是一直进行的新建并且没有进行回收导致内存急剧上升从而产生oom。
处理方法
一.将需要滑动的布局放入RecycleView中 去掉NestedScrollView 滑动布局。
二.将RecycleView 中的setNestedScrollingEnabled(false);属性设置成false,将滑动交由RecycleView 自己处理。
另外我还没找到更好得到处理方式,有哪位大神 有更好的处理方式请给我留言。
进阶用法
当item中含有数量较多的图片时可在onViewRecycled中进行图片的回收处理,还有终止图片的网络请求等,这样可以非常有效的进行内存的释放,防止产生oom异常。