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