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 androidx.lifecycle.LiveData#observeForever 2)postValue和setValue过程分析 LiveData可以通过postValue和setValue来设置数据,当请求完网络数据的时候,就可以调用postValue或setValue来设置数据,当然postValue是可以在任意线程进行调用,setValue只能在主线程调用。postValue最终也是调用setValue方法。 androidx.lifecycle.LiveData#postValue 查看mPostValueRunnable对象的实现方法如下,可以看到,最好还是调用的setValue方法: androidx.lifecycle.LiveData#setValue 可以看到,setValue方法中主要做了三个事: 1、版本号+1,LiveData的mVersion变量表示的是发送数据的版本,每次发送一次数据, 它都会+1; 2、将新值赋值给全局变量mData; 3、调用dispatchingValue方法分发数据。 androidx.lifecycle.LiveData#dispatchingValue 可以看到dispatchingValue方法是去调用的considerNotify方法,对该方法进行查看: considerNotify方法里面也是对生命周期的一个判断,然后版本号判断OK后,再去对版本号和一个数据的通知更新。
问题总结
分析到这里,livedata的基本原理算是分析了大概流程,有兴趣可以进一步深入分析。