RecyclerView Adapter系列之集成Lifecycle

简介: RecyclerView Adapter系列之集成Lifecycle

为什么集成Lifecycle


Lifecycle几乎已经是Android开发的标准库,如LiveData、ViewModel甚至协程,都有Lifecycle的扩展,毋庸置疑,我们集成它,一方面为了赶上潮流,顺势而为。另一方面为了更好的管理Adapter的数据,我们都知道Adapter有个onDetachedFromRecyclerView方法,在Adapter从RecyclerView解绑的时候被调用,可你有没有注意到一个细节,在Activity的onDestroy后并没有触发onDetachedFromRecyclerView,反而是你主动调用RecyclerView.adapter = null 的时候才会被调用,所以说这也是我为什么要集成Lifecycle的重要原因。

如何集成呢?


image.png

这里为什么会有一个arrayLifeObservers呢?因为框架本身扩展了动画,单选多选等功能,这样就可以实现任何扩展的功能都可以监听到生命周期回调,来看个例子

image.png

image.png

这就是我扩展的动画列表,它是一个常量animationArray缓存,在当前页面被onDestroy的时候,我为什么还要保留它呢?直接清理干净就行了,这样及时的释放内存。这也是为什么还要一个观察者模式的原因

最后我们将LifecycleAdapter集成到框架里

image.png

这里有个细节说下,之前这个BaseAdapter叫ViewHolderCacheAdapter,被重构成了BaseAdapter,这样有利于扩展继承,在名字上更贴切。让BaseAdapter继承LifecycleAdapter,实现arrayLifeObservers

image.png

然后实现onStateChanged函数,在ON_DESTROY的生命周期内调用,recyclerView.adapter = null ,最后触发onDetachedFromRecyclerView

image.png

然后释放掉所有缓存和依赖

ViewModel 层也需要Lifecycle吗?


答案:需要

image.png

当我们实现一个ViewModel的时候,难免会有一些缓存,这些缓存都存在ViewModel的对象里,在释放的时候,我们完全可以全部清理掉,如图:

image.png

这样以来很容易被垃圾回收器回收,减少依赖,提高回收的效率,ViewModel的生命周期来源于哪里呢?请看图

image.png

这里为什么用一个新的LifecycleViewModel呢?一方面因为开闭原则,一方面是接口隔离,这样确实也很合理,然后让DefaultViewModel实现LifecycleViewModel

image.png

最后,在ListAdapter的生命周期里回调ViewModel的onStateChanged即可,需要判断ViewModel是否继承自LifecycleViewModel,如果未继承,则不需要处理

image.png

在ListAdapter中重载BaseAdapter的onStateChange,在生命周期变化的过程中通知ViewModel就行了,你是不是想问,Adapter什么时候添加到生命周期观察的呢?

image.png

在之前的动态扩展into函数中,我们只需要加入这样一段代码就可以了,是不是很简单。这样做的目的也是为了保持框架的扩展性,没有实现LifecycleAdapter也同样可以调用我们的扩展,并且不会出现问题。

总结


好了,生命周期的集成就是这样,希望对你有帮助。

项目地址


github.com/ibaozi-cn/R…

目录
相关文章
|
Java Android开发
Adroid RecyclerView adapter 封装
Adroid RecyclerView adapter 封装
|
XML SQL 前端开发
Adapter基础讲解
这一节我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单来说就是:将各种数据以合适的形式显示到view上,提供 给用户看!
454 0
|
XML 缓存 算法
一个全新的RecyclerView Adapter框架源码开源
一个全新的RecyclerView Adapter框架源码开源
288 0
一个全新的RecyclerView Adapter框架源码开源
|
存储 缓存 开发工具
RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?
RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?
|
前端开发 开发者 索引
less-adapter |学习笔记
快速学习 less-adapter
153 0
less-adapter |学习笔记
|
Android开发
【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )
【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )
315 0
【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )
|
Android开发 Java 容器
Android官方架构组件:Lifecycle详解&原理分析
应该是 Android Jetpack 讲解的最好的博客系列: Android官方架构组件Paging:分页库的设计美学 Android官方架构组件Navigation:大巧不工的Fragment管理框架 Android官方架构组件Lifecycle:生命周期组件详解&原理分析 概述 在过去的谷歌IO大会上,Google官方向我们推出了 Android Architecture Components,其中谈到Android组件处理生命周期的问题,向我们介绍了 Handling Lifecycles。
2183 0
ListView Adapter.notifi不管用
前言,在使用到adapter的时候,一般要用List来装数据实体,这里两种不同的写法容易遇到不同的问题。 第一种写法 class TestAdapter{ private List list; *** public TestAdapter(List list){ this.
736 0