jetpack探究之LiveData

LiveData

一 概述

是一种可观察的数据存储器类。该类遵循其他组件的生命周期,这样的一种特性保证它只观察处于活跃生命状态的组件观察者

如果观察者(由 Observer 类表示)的生命周期处于 STARTEDRESUMED状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。

优势

  • 确保界面符合状态,数据改变时通知界面
  • 不会发生内存泄漏,与LifeCycles绑定,在组件生命周期结束后,自动清理
  • 不会因为Activity停止而崩溃,因为观察者在非活跃状态时不会接收任何通知
  • 自动感知生命周期
  • 数据保证最新
  • 允许适当的配置修改,比如因为屏幕旋转Activity重建,LiveData即刻接收最新数据
  • 可以单例模式LiveData从而共享资源

二 使用

  1. ViewModel类中创建LiveData实例,用以存储某类型的数据,并可通过 getter 方法进行访问

        private MutableLiveData<Integer> score;
    
        public MutableLiveData<Integer> getScore() {
           
            if(score==null){
           
                score=new MutableLiveData<>();
                score.setValue(0);
            }
            return scoreA;
        }
    
  2. 在界面控制器(如 Activity 或 Fragment)中创建 Observer 对象

    一般来讲,在onCreate中开始观察LiveData,保证组件变活跃后有立即可以观察的对象

    Observer<Integer> observer=new Observer<Integer>() {
           
                @Override
                public void onChanged(Integer s) {
           
                    //updateUI
                }
            };
    
  3. 使用 observe() 方法将 Observer 对象附加到 LiveData 对象。observe() 方法会采用 LifecycleOwner 对象。这样会使 Observer 对象订阅 LiveData 对象,以使其收到有关更改的通知

   viewModel.getScoreA().observe(this,observer);

三 源码结构

LiveData

LiveData 是可以在给定生命周期内观察到的数据持有者类。

即 将LifecycleOwnerObserver成对添加,当配对的LifecycleOwner处于活动状态,即Lifecycle.State.STARTEDLifecycle.State.RESUMED时,向观察者发送有关包装数据的修改。

通过 observeForever(Observer)添加的观察者被视为始终处于活动状态,始终能收到消息。需手动移除

生命周期移至 Lifecycle.State.DESTROYED 状态时,添加了生命周期的观察者被移除,保证不会内存泄漏。

主要方法:

onActive()onInactive():在观察者数量在0-1变化时通知,方便在没有观察者的情况下释放大量资源

getValue() : 获取LiveData 包装的数据

observe(LifecycleOwner owner, Observer observer) 设置观察者(主线程调用)

setValue(T value) 设值(主线程调用),可见性为 protected 无法直接使用

postValue(T value) 设置(其他线程调用),可见性为 protected 无法直接使用

MutableLiveData

继承自LiveData,是LiveData的实现类,公开了 setValuepostValue 方法。

Observer

接口类,内部只有一个方法onChanged(T t),数据发生变化时调用

四 源码分析

1如何控制在 activity 或 fragment 活动状态时接收回调,否则不接收

调用 observe 方法时,部是通过 LifecycleBoundObserver 将 owner 和 observer 包裹起来并通过 addObserver 方法添加观察者的,因而当数据变化时,会调用 LifecycleBoundObserveronStateChanged 方法

以下是onStateChanged 方法

@Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
     
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
     
                removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

传入了一个shouldBeActive()方法,只有 STARTEDRESUMED 状态 shouldBeActive() 才返回 true,因此只有在Activity和Fragment处于活动状态时才接受观察。

2如何在 activity 或 fragment 销毁时自动取消注册观察者

以下代码是在LifecycleBoundObserveronStateChanged中的

if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
     
                removeObserver(mObserver);
                return;
            }

表明在DESTROYED状态,会移除掉观察者

3如何保证 LiveData 持有最新的数据

dispatchingValue 方法内部调用了 considerNotify 方法,在considerNotify中区别了observer的版本号,如果是最新的数据则直接return

mVersionsetValue 方法中 进行更改,保证了数据最新

参考自:【背上Jetpack之LiveData】ViewModel 的左膀右臂 数据驱动真的香
https://juejin.im/post/6844904111112978439

你可能感兴趣的:(java,android,jetpack)