为什么集成Lifecycle
Lifecycle几乎已经是Android开发的标准库,如LiveData、ViewModel甚至协程,都有Lifecycle的扩展,毋庸置疑,我们集成它,一方面为了赶上潮流,顺势而为。另一方面为了更好的管理Adapter的数据,我们都知道Adapter有个onDetachedFromRecyclerView方法,在Adapter从RecyclerView解绑的时候被调用,可你有没有注意到一个细节,在Activity的onDestroy后并没有触发onDetachedFromRecyclerView,反而是你主动调用RecyclerView.adapter = null 的时候才会被调用,所以说这也是我为什么要集成Lifecycle的重要原因。
如何集成呢?
这里为什么会有一个arrayLifeObservers呢?因为框架本身扩展了动画,单选多选等功能,这样就可以实现任何扩展的功能都可以监听到生命周期回调,来看个例子
这就是我扩展的动画列表,它是一个常量animationArray缓存,在当前页面被onDestroy的时候,我为什么还要保留它呢?直接清理干净就行了,这样及时的释放内存。这也是为什么还要一个观察者模式的原因
最后我们将LifecycleAdapter集成到框架里
这里有个细节说下,之前这个BaseAdapter叫ViewHolderCacheAdapter,被重构成了BaseAdapter,这样有利于扩展继承,在名字上更贴切。让BaseAdapter继承LifecycleAdapter,实现arrayLifeObservers
然后实现onStateChanged函数,在ON_DESTROY的生命周期内调用,recyclerView.adapter = null ,最后触发onDetachedFromRecyclerView
然后释放掉所有缓存和依赖
ViewModel 层也需要Lifecycle吗?
答案:需要
当我们实现一个ViewModel的时候,难免会有一些缓存,这些缓存都存在ViewModel的对象里,在释放的时候,我们完全可以全部清理掉,如图:
这样以来很容易被垃圾回收器回收,减少依赖,提高回收的效率,ViewModel的生命周期来源于哪里呢?请看图
这里为什么用一个新的LifecycleViewModel呢?一方面因为开闭原则,一方面是接口隔离,这样确实也很合理,然后让DefaultViewModel实现LifecycleViewModel
最后,在ListAdapter的生命周期里回调ViewModel的onStateChanged即可,需要判断ViewModel是否继承自LifecycleViewModel,如果未继承,则不需要处理
在ListAdapter中重载BaseAdapter的onStateChange,在生命周期变化的过程中通知ViewModel就行了,你是不是想问,Adapter什么时候添加到生命周期观察的呢?
在之前的动态扩展into函数中,我们只需要加入这样一段代码就可以了,是不是很简单。这样做的目的也是为了保持框架的扩展性,没有实现LifecycleAdapter也同样可以调用我们的扩展,并且不会出现问题。
总结
好了,生命周期的集成就是这样,希望对你有帮助。