
lifecycle组件包括lifecycleOwner、lifecleObserver,能方便监听Activity或者Fragment的生命周期。
步骤:
1.实现lifecycleObserver接口
实现DefaultlifecycleObserver接口,然后重写里面生命周期方法; 直接实现lifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;对于这两种形式,lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。
2.添加观察者。
通过getlifecycle().addobserver(mPresenter)方法
Activity基类实现了lifecycleOwner方法,因此可以直接获取该方法。
3.监听生命周期。
注意:activity/Fragment的生命周期发生改变时,onStart、onResume方法会调用后调用Observer中重写方法,onPause/onDestory反之。
liveData
liveData是一个数据持有类,具有如下特点:
1.数据可以被观察者订阅。
2.能感知组件(Fragment、Activity、Service)的生命周期。
2.只有在组件处于激活状态(STATED、RESUME)才会通知数据刷新。(除了onDestory方法为DESTORY状态,其他回调方法皆为STARTD/RESUME等)
liveData的优点: 能够保证数据和UI统一这个和liveData采用了观察者模式有关,liveData是被观察者,当数据有变化时会通知观察者(UI)。
减少内存泄漏这是因为liveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。
当Activity停止时不会引起崩溃这是因为组件处于非激活状态时,不会收到liveData中数据变化的通知。
不需要额外的手动处理来响应生命周期的变化这一点同样是因为liveData能够感知组件的生命周期,所以就完全不需要在代码中告诉liveData组件的生命周期状态。
组件和数据相关的内容能实时更新组件在前台的时候能够实时收到数据改变的通知,这是可以理解的。当组件从后台到前台来时,liveData能够将最新的数据通知组件,这两点就保证了组件中和数据相关的内容能够实时更新。
针对configuration change时,不需要额外的处理来保存数据我们知道,当你把数据存储在组件中时,当configuration change(比如语言、屏幕方向变化)时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。当我们采用liveData保存数据时,因为数据和组件分离了。当组件被recreate,数据还是存在liveData中,并不会被销毁。
资源共享 通过继承liveData类,然后将该类定义成单例模式,在该类封装监听一些系统属性变化,然后通知liveData的观察者,这个在继承liveData中会看到具体的例子。
liveData内部是通过lifecycle实现监听回调的,具体可以看源码。
步骤:
1.创建保存特定数据类型的liveData实例;
2.创建Observer对象,作为参数传入liveData添加观察者;
3.更新liveData对象存储数据。
1.添加依赖
//@R_419_4163@l API ‘androIDx.lifecycle:lifecycle-@R_419_4163@l-ktx:2.2.0-Alpha02‘//lifecycleObserver 与 liveData API ‘androIDx.lifecycle:lifecycle-extensions:2.2.0-Alpha02‘
2.创建liveData实例
AndroID文档中建议将liveData与@R_419_4163@l配合起来使用,当然它也可以单独使用,不过需要注意数据和组件之间的分离,liveData一定不能持有组件的对象,否则在组件被销毁时,liveData仍持有Activity/Fragment 对象,导致的结果是组件无法被回收。
mutablelivedata为liveData的子类。
3.创建Observer对象,添加观察者。
在组件中创建通过liveData.Observe()方法添加观察者,当数据变化时会通过该回调方法通知观察者,d出吐司。
添加观察者的方式为2种:
observe()方法:当组件生命周期发生变化时,onStateChanged()方法会被调用。组件为DESTORY状态时,会自动取消订阅。 observeForever()方法:onStateChanged()方法会被调用三次(CREATED、STARTED、RESUMED),后面就不会收到DESTROYED的状态,需要手动取消订阅。4.更新liveData中的数据。
更新liveData有2种方式,:
setValue() :主线程中调用,如果非主线程,会抛出异常。 postValue() :既可以在主线程也可以在子线程中调用,最终会调用setValue方法改变存储的数据。
参考链接:
1.https://blog.csdn.net/zhuzp_blog/article/details/78871374
2.https://blog.csdn.net/zhuzp_blog/article/details/78871527
总结以上是内存溢出为你收集整理的Android 架构组件-Lifecycle、LiveData、ViewModel全部内容,希望文章能够帮你解决Android 架构组件-Lifecycle、LiveData、ViewModel所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)