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仍然能夠持有狀態。

相關文章
相關標籤/搜索