LiveData基本教程

转载请注明链接: https://blog.csdn.net/feather_wch/article/details/88648559

LiveData基本教程

版本号:2019-04-12(11:30)


简介

1、LiveData的简介

  1. LiveData是一种类,持有可被观察的数据
  2. LiveData是一种可感知生命周期的组件,意味着该组件重视其他app组件的生命周期,如Activity、Fragment、Service
    • 该组件能确保,仅仅在Activity\Fragment\Service等组件都处于活跃的生命周期状态的时候,才去更新app组件。

2、LiveData只有当观察者的生命周期处于活跃状态时才会去通知观察者。

  1. 实现了Observer类的观察者,可以注册监听LiveData
  2. 活跃状态就是指处于STARTED或者RESUMED状态
  3. 处于非活跃的观察者,LiveData不会去通知这些观察者

3、可以注册一种观察者, 该观察者与LifecycleOwner对象(如:Activity、Fragment)相关联。

  1. 在对应的Lifecycle Object处于DESTORYED状态时,会自动解除LiveData和该观察者的注册关系

4、在Activity、Fragment中这种自动解除注册的特性非常有用

  1. Activity、Fragment不用担心会出现内存泄露
  2. Activity、Fragment销毁时,LiveData会自动解除其注册关系

优势

5、LiveData能确保UI和数据状态相符

  1. 因为是观察者模式,LiveData会在生命周期状态改变时,通知观察者
  2. 可以在观察者对象中进行UI的更新操作

6、LiveData没有内存泄露

  1. 观察者和Lifecycle对象绑定,能在销毁时自动解除注册

7、LiveData不会给已经停止的Activity发送事件

  1. 如果观察者处于非活跃状态,LiveData不会再发送任何事件给这些Observer对象

8、LiveData能确保不再需要手工对生命周期进行处理

  1. UI组件仅仅需要对相关数据进行观察
  2. LiveData自动处理生命周期状态改变后,需要处理的代码。

9、LiveData能保证数据最新

  1. 一个非活跃的组件进入到活跃状态后,会立即获取到最新的数据
  2. 不用担心数据问题

10、LiveData在横竖屏切换等Configuration改变时,也能保证获取到最新数据

  1. 例如Acitivty、Fragment因为屏幕选装导致重建, 能立即接收到最新的数据

11、LiveData能资源共享

  1. 如果将LiveData对象扩充,用单例模式系统服务进行包裹。这些服务就可以在app中共享。
  2. 只需要LiveData和系统服务connect,其他观察者只需要监视LiveData就能获取到这些资源

使用LiveData

1、LiveData的使用遵循下面三个步骤

  1. 创建LiveData的实例,并持有具有类型的数据
  2. 创建Observer对象,该对象具有onChanged()方法,在LiveData的数据改变时,会调用onChanged()方法,进行相应的处理工作。可以将Observer放置到activity、fragment
  3. 利用observe()方法ObserverLiveData联系起来。
    * observe()接收一个LifecycleOwner对象
    * 可以使用observeForeve(Observer)注册一个没使用LifecycleOwnerObserver,这种场景中,该Observer会认为是一直存活的。
    * 使用removeObserver(Observer)可以移除这些观察者

创建LiveData对象

2、创建LiveData对象

  1. LiveData能用来包裹所有数据,包括实现了Collections的对象,例如List
  2. LiveData通常存储在ViewModel之中, 并通过get方法来获取
public class UserViewModel extends ViewModel {
   
    private MutableLiveData<String> mName;
    private MutableLiveData<Integer> mAge;

    public MutableLiveData<String> getName() {
   
        if(mName == null){
   
            mName = new MutableLiveData<>();
        }
        return mName;
    }

    public MutableLiveData<Integer> getAge() {
   
        if(mAge == null){
   
            mAge = new MutableLiveData<>();
        }
        return mAge;
    }
}

3、为什么将LiveData放置到ViewModel中,而不放到activity或者fragment中?

  1. 避免fragment和activity的代码臃肿
  2. LiveData和特定的activity/fragment解耦,能够在configuration改变的时候,LiveData依然存活。

观察LiveData对象

4、在App组件的哪个生命周期适合观察LiveData对象?为什么?

  1. app组件的onCreate()方法
  2. 不适合在onResume()等方法中,可能会调用多次
  3. 能确保组件能尽可能快的展示出数据。只要app组件处于启动状态(STARTED)就会立即接收到LiveData对象中的数据—前提是已经监听了LiveData
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值