美文网首页
Android LifeCycle 和 LiveData 总结

Android LifeCycle 和 LiveData 总结

作者: 散落_a0b3 | 来源:发表于2019-01-14 21:21 被阅读0次

    LifeCycle 是啥,咋用,原理?


    Android组件定义了一套状态和回调,也就是我们说的生命周期。我们要使用组件,就要在回调中写组件生命周期相关的处理逻辑。这种框架会导致业务逻辑代码和组件状态维护的代码混淆在一起,使得项目难以维护。因此Android在support库里,又定义了一套和原生声明周期一致的辅助类,来帮我们处理组件回调相关业务逻辑,使我们能够以逻辑自洽的方式来实现自己的业务代码,与原生组件剥离开来。

    Lifecycle的实现分为三个主要角色,一个是Lifecyle,它定义了状态和事件,以及监听器逻辑和获取当前状态的接口;一个是LifecycleOwner,它维护一个自己的Lifecycle对象;一个是LifecycleObserver,它用来监听一个Lifecycle对象的状态。我们看到LifecycleOwner在这里的作用只是获取Lifecycle,为什么要多此一举,而不是使用Observer和Lifecycle直接交互呢?

    实际上是可以将Lifecycle定义成接口,然后采用类继承的方式来实现类似的效果的。官方之所以选择使用代理和转发机制,是因为这样更加容易复用。Android带有生命周期的组件不止一个,每个都实现相同的维护逻辑非常麻烦,采用这种方式,它只要在一处实现状态切换、回调、Observer管理等复杂的逻辑,即LifecycleRegistry类,其他地方进行转发即可。并且,这种复用方式,允许我们自己的组件,通过相同的扩展方式来实现生命周期的支持。

    Lifecycle的实现还是比较简单的,就是通过维护和回调LifecycleRegistry对象来支持这个机制。Fragment默认就维护了一个LifecycleRegistry对象,支持lifecycle机制。在support库定义的SupportActivity中,SupportActivity通过默认添加一个ReportFragment,再让这个Fragment转发回调到它自己的LifecycleRegistry对象中,来实现对Lifecycle的支持。

    LiveData是啥,咋用,原理?


    LiveData<T>是一个泛型数据容器,它与Observer<T>搭配工作。我们可以创建一个LiveData对象,和一个Observer对象,并将这个Observer绑定到一个LifeCycleOwner的实例。之后我们可以使用LiveData来管理我们的数据,当它所持有的数据发生变化,且LifeCycleOwner属于active状态的时候,它就会通知自己的Observer对象数据发生变化了,并且把新数据回传给它。LiveData的作用,主要是用于在组件方监听数据方的变化动作,并且这个变化和组件状态紧密相关,比如基于某个数据进行页面跳转。当然我们可以用它来做线程切换,更新UI等,但是总体上没有databinding好用。

    那么LiveData是怎么实现这个功能的呢?

    LiveData它提供了observe方法,将LifecycleOwner和Observer使用一个LifecycleBoundObserver内部类对象粘合起来。这个LifecycleBoundObserver实现了LifecycleObserver,可以监听LifecycleOwner的回调,在回调中它去判断状态,并根据状态判断是否回调Observable中的onChanged方法,同时,它还会回调子类的onActive和onInactive方法,通过这种方式来实现基于状态的Observer机制。

    除此之外,LiveData实现了Observer的灵活的管理机制,可以移除某一个Observer,或者某一个LifecycleOwner的所有Observable。

    在以上的逻辑当中,我们可以看出来LiveData并不与LifecycleOwner直接关联,它允许自己管理的Observers中,存在多种的LifecycleOwner监听(即数据变化时,根据不同的Observer绑定的不同Owner的状态,进行变化通知),但是,不允许一个Observer和多个LifecycleOwner进行绑定,因为回调中Observer不知道是哪个Owner属于活跃状态允许的回调,这是不符合我们的监听某一个组件状态来允许数据变更的设计意图的。

    相关文章

      网友评论

          本文标题:Android LifeCycle 和 LiveData 总结

          本文链接:https://www.haomeiwen.com/subject/ekhsdqtx.html