我是靠谱客的博主 神勇巨人,最近开发中收集的这篇文章主要介绍【Android】MutableLiveData与LiveDataMutableLiveData是什么?关于postValue和setValue的机制简单理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MutableLiveData笔记

  • MutableLiveData是什么?
    • LiveData是什么?
    • LiveData常用的方法
    • MutableLiveData和LiveData的区别
  • 关于postValue和setValue的机制简单理解

MutableLiveData是什么?

public class MutableLiveData
extends LiveData<T>

java.lang.Objectandroid.arch.lifecycle.LiveData<T>android.arch.lifecycle.MutableLiveData<T>

MutableLiveDataLiveData的子类

LiveData是什么?

在这里插入图片描述
Android的官方文档种描述为可以在给定生命周期观察数据持有类
在这里插入图片描述
因此生命周期拥有者应和观察者成对添加,使用observe:当LiveData中的数据发生变化时,并且生命周期的状态为START或是RESUME状态时,观察者就能观察到数据变化。这么做的原因是避免资源的浪费,当所有者的状态变为destroy状态,观察者将自动被移除。

LiveData常用的方法

  • postValue
    在这里插入图片描述
    作用是在子线程更新数据,当然在主线程中也可以使用。
  • setValue
    在这里插入图片描述
    作用是在主线程中修改数据,注意只能在主线程中调用

注意两个方法都是protected修饰的,因此一般封装一个继承LiveData的类,在该类的中调用此方法。

  • observe

    void observe (LifecycleOwner owner, 
                    Observer<T> observer)
    

    作用是添加生命周期拥有者和观察者,当拥有者处于活跃状态时,观察者能接收到数据更新。

  • observeforever

    void observeForever (Observer<T> observer)
    

    作用是观察数据变化,可以无视生命周期的变化,因此需要手动移除。
    注意,此时已不需要添加生命周期拥有者。
    为什么可以不添加生命周期拥有者呢?因为这个方法的作用就如他的名字一样,一直观察数据是否变化。

        @MainThread
        public void observeForever(@NonNull Observer<? super T> observer) {
            assertMainThread("observeForever");
            AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
            ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
            if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
                throw new IllegalArgumentException("Cannot add the same observer"
                        + " with different lifecycles");
            }
            if (existing != null) {
                return;
            }
            wrapper.activeStateChanged(true);
        }
    

    最后一行就是其中的秘密

    void activeStateChanged(boolean newActive) {
        if (newActive == mActive) {
            return;
        }
        // immediately set active state, so we'd never dispatch anything to inactive
        // owner
        mActive = newActive;
        boolean wasInactive = LiveData.this.mActiveCount == 0;
        LiveData.this.mActiveCount += mActive ? 1 : -1;
        if (wasInactive && mActive) {
            onActive();
        }
        if (LiveData.this.mActiveCount == 0 && !mActive) {
            onInactive();
        }
        if (mActive) {
            dispatchingValue(this);
        }
    }
    

    在observeForever方法中调用wrapper.activeStateChanged(true),将其设置为常量true。
    同比observer方法,是将生命周期拥有者传入,再进行观察,如果状态发生改变立刻调用activeStateChanged。
    在这里插入图片描述
    在这里插入图片描述

  • removeObserver

    void removeObserver (Observer<T> observer)
    

    作用是移除指定的观察者

  • removeObservers

    void removeObservers (LifecycleOwner owner)
    

    作用是移除指定的生命周期拥有者下的所有观察者

MutableLiveData和LiveData的区别

其实MutableLiveData的源码很简单
在这里插入图片描述
只有两个方法postValue和setValue,但是和LiveData的区别就在于是用public修饰的。
因此个人觉得会比LiveData方便一些。

关于postValue和setValue的机制简单理解

调用postValue后执行顺序
在这里插入图片描述
从这里可以看出调用了setValue
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里调用了观察者的onChanged方法,此时观察者可以接收到数据变化。

不足之处欢迎批评

最后

以上就是神勇巨人为你收集整理的【Android】MutableLiveData与LiveDataMutableLiveData是什么?关于postValue和setValue的机制简单理解的全部内容,希望文章能够帮你解决【Android】MutableLiveData与LiveDataMutableLiveData是什么?关于postValue和setValue的机制简单理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部