LiveData原理分析

LiveData原理分析android

1 LiveData简介数据库

大部分Android应用会从网络或SQLite数据库存取数据,并根据数据更新界面。为了不ANR,主线程中不能存取数据。然后台线程中没法更新界面。一般的作法是让后台线程将数据经过Handler传递给主线程。可是当界面较为复杂时,使用Handler这种方式变得很是复杂。为了简化界面更新的工做,Google在Jetpack中提供了LiveData组件。LiveData具备保证UI和状态一致、避免内存泄漏、避免手动管理生命周期等优势。网络

2 LiveData用法ide

LiveData是一个在线程间传递数据的容器。当后台线程获得数据后,经过postValue()方法投递数据。其余线程经过getValue()获得数据。为了通知其余线程,LiveData采用的观察者模式。经过observe()方法,主线程能够在数据更新后当即获得通知。下面是一个简单的例子:工具

public class BackgroundThread extends Thread {

        public BackgroundThread(LiveData<Data> aLiveData) {
                liveData = aLiveData;
        }

        @Override
        public void run() {
                Data data = readDataFromFile();
                liveData.postValue(data);
        }
}

public MainActivity extends AppCompatActivity {

        private LiveData<Data> liveData = new MutableLiveData<>();
        private BackgroundThread thread = new BackgroundThread(liveData);
        private TextView textview;

        @Override protected onCreate(Bundle bundle) {
                // ...

                liveData.observe(this, new Observer<Data>() {
                                @Override
                                public void onChanged(Data data) {
                                        textview.setText(data.getText());
                                }});
        }
}

从例子里能够看到,observe()方法有两个参数,第二个参数是观察者。那么第一个参数是什么呢?第一个参数的类型是LifecycleOwner,加入LifecycleOwner的目的是自动管理Activity生命周期。这一点在后面会进行介绍。post

LiveData类定义在android.arch.lifecycle中,使用时须要在build.gradle引入依赖项:gradle

implementation "android.arch.lifecycle:extensions:1.1.1"

3 数据的传递ui

实际上LiveData传递数据的方法也是经过Handler。在postValue()方法中,LiveData调用ArchTaskExecutor.postToMainThread(),将一个Runnable对象传递给主线程。这个Runnable对象调用setValue()对数据进行更新。this

更新数据的时候,LiveData首先将版本号加1,而后遍历观察者。若是观察者处于活跃状态(Lifecycle.State是STARTED或RESUMED),而且观察者的版本号小于LiveData,LiveData会调用观察者的onChanged()方法进行通知。spa

4 生命周期管理

这一段简单介绍一下生命周期管理。当观察者的生命周期不是STARTED或RESUMED时,数据更新不会进行通知。这是怎么实现的呢?在调用observe()时,第一个参数是LifecycleOwner,第二个参数是Observer。LiveData创建一个LifecyleBoundObserver对象,将这两个参数绑定到一块儿,来接收Lifecycle的生命周期更新和LiveData的数据更新。LifecycleBoundObserver是一个的内部类,它持有了LiveData引用。当生命周期发生变化(LifecycleRegistry.handleLifecyleEvent)时,LifecycleBoundObserver调用LiveData的dispatchingValue()方法,获取最新数据。

5 Lifecycle

Lifecycle生命了Android生命周期。Lifecycle包括6个状态和7个事件,分别是:

| 状态 | | DESTROY | | INITIALIZED | | CREATED | | STARTED | | RESUMED |

| 事件 | | ON_CREATE | | ON_START | | ON_RESUME | | ON_PAUSE | | ON_STOP | | ON_DESTROY | | ON_ANY |

6 Room

Room是Jetpack提供的SQLite ORM工具。Room中存取数据的方法都是阻塞的,要在后台执行,所以很是适合与LiveData配合使用。Room中定义的Dao能够返回LiveData,当SQLite查询返回后,对界面进行更新。

7 ViewModel

另外一个常常和LiveData搭配使用的是ViewModel。ViewModel用于管理Activity或Fragment中的各LiveData对象。能够把ViewModel当作是LiveData的集合。ViewModel的优势是能够和Activity或Fragment绑定在一块儿,而且在配置改变引发的Activity/Fragment销毁时,ViewModel仍然能够持有状态。

相关文章
相关标签/搜索