LiveData原理分析

时间:2023-02-02 12:16:09

LiveData原理分析

问题背景

在安卓开发过程中,经常会使用到livedata。 LiveData是Android Architecture Components 其中的一个组件。主要用于更新UI数据和组件之间传值。 1、LiveData是一种持有可被观察数据的类。它通过观察者模式实现了数据变化的动态通知,即当观察者生命周期处于活跃状态时,能够感知数据的变化。

2、能够感知生命周期,内部通过Lifecycle来感知生命周期,在Activity、Fragment、Service中当对应生命周期为Destroy的时候,会销毁观察者,避免内存泄露。 所以问题来了,livedata实现的原理是什么呢?

问题分析

(1)LiveData的简单使用

LiveData的使用比较方便,只需要以下三步: 1、创建LiveData对象,LiveData是抽象类,所以需要创建它的子类MutableLiveData; 2、设置观察者observe,第一个参数是LifecycleOwner对象,第二个是观察者监听,当数据改变的时候会在onChanged方法内做出响应; 3、设置数据,通过postValue或者setValue方法来更新数据; 代码如下(livedata一般结合viewmodel使用,下面只是简单示例,具体可参考 https://blog.51cto.com/baorant24/5778708):

public class MainActivity extends AppCompatActivity {
    private MutableLiveData liveData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 1.创建LiveData对象 
        liveData = new MutableLiveData();
        // 2.添加观察者
        liveData.observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
                // 提示数据变化
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 3.改变数据
                liveData.postValue("测试");
            }
        });
    }

}

(2)LiveData的原理分析

1)LiveData是如何实现观察者订阅,并发送事件的? LiveData通过observe和observeForever来订阅观察者,查看源码可以看到: androidx.lifecycle.LiveData#observe LiveData原理分析 androidx.lifecycle.LiveData#observeForever LiveData原理分析 2)postValue和setValue过程分析 LiveData可以通过postValue和setValue来设置数据,当请求完网络数据的时候,就可以调用postValue或setValue来设置数据,当然postValue是可以在任意线程进行调用,setValue只能在主线程调用。postValue最终也是调用setValue方法。 androidx.lifecycle.LiveData#postValue LiveData原理分析 查看mPostValueRunnable对象的实现方法如下,可以看到,最好还是调用的setValue方法: LiveData原理分析 androidx.lifecycle.LiveData#setValue LiveData原理分析 可以看到,setValue方法中主要做了三个事: 1、版本号+1,LiveData的mVersion变量表示的是发送数据的版本,每次发送一次数据, 它都会+1; 2、将新值赋值给全局变量mData; 3、调用dispatchingValue方法分发数据。 androidx.lifecycle.LiveData#dispatchingValue LiveData原理分析 可以看到dispatchingValue方法是去调用的considerNotify方法,对该方法进行查看: LiveData原理分析 considerNotify方法里面也是对生命周期的一个判断,然后版本号判断OK后,再去对版本号和一个数据的通知更新。

问题总结

分析到这里,livedata的基本原理算是分析了大概流程,有兴趣可以进一步深入分析。