LiveData 為 Android Architecture Component 其中之一,主要用途為持有可觀察數據(observable data),並讓有註冊且為活躍狀態的觀察者自動收到更新。
若了解或實作過Observer Pattern(觀察者模式)會很容易了解,可以把LiveData看作Subject(主題)也就是資料的來源。對Subject有興趣的observers可以訂閱主題,訂閱完成後當主題內的數據發生變化時,observers便會自動收到通知。
基本上 Observer Pattern 是用來取代 polling 的解決方案。關於Observer Pattern 可以參考這篇
回過頭來,首先看看LiveData的OverView(這裡是官網介紹)
首先LiveData是一種擁有可觀察數據的類別(看字面不好懂,直接看實作吧) e.g.,
private MutableLiveData<String> mCurrentName = new MutableLiveData<String>();
因為LiveData為abstract class,通常在實作上會以MutableLiveData(LiveData's subclass)取代LiveData。角括號可以傳入任何型別,包含Collections,list等等。
LiveData最大的特色為它具有生命週期感知(Lifecycle-aware)能力,該能力可以讓LiveData得知其他元件(Activity, Fragment, Service)的生命週期。
因此可以避免很多必須手動操作的情況,如螢幕旋轉時需要儲存數據,UI和數據之間的同步,memoey leak等等。
如何使用LiveData
1.建立LiveData實體並持有特定類型的數據。這通常在ViewModel類別內實作
2.建立Observer物件並定義onChanged方法,該方法內容用來描述當LiveData持有的數據改變時所作的事。你通常會在UI Controlller內(Activity, fragment)建立Observer物件
3.使用observe方法連結Observer物件和LiveData物件。observer方法需要傳入LifecycleOwner物件,這讓Observer物件訂閱LiveData物件並讓LiveData可以通知改變。你通常會在UI Controller內(activity, fragment)連結Observer物件
Note:
你可以藉由observeForever(Observer)方法來註冊一個observer而不需要結合LifecycleOwner。
在這種情況下observer會被當作永遠都是活躍的,因此總是會收到改變的資訊。反之,可以使用removeObserver(Observer)來移除observer
當LiveData的資料被更新之後,所有的已註冊且相關連的LifecycleOwner為活躍的observers會收到通知。
Example
1.Create LiveData objects
LiveData可以包含任何類型的數據,如List等等。
LiveData通常儲存在ViewModel內並透過getter方法來存取。
public class NameViewModel extends ViewModel {
private MutableLiveData<String> mCurrentName = new MutableLiveData<String>();
public MutableLiveData<String> getCurrentName() {
return mCurrentName;
}
}
Note:確保LiveData儲存在ViewModel而不是activity或fragment
2.Observe LiveData objects
在大多數的情況下,onCreate方法為初始觀察LiveData位置。
在一般的情況下LiveData只在數據有更新時且觀察者為活躍的狀態才發送通知。但有2個例外,第1為當觀察者從非活躍狀態轉為活躍狀態時會收到通知。
第2為當觀察者是第2次從非活躍狀態轉為活躍狀態,則只有在自上次活動狀態以來該值發生變動時才會收到更新。
(也就是說當觀察者第1次從非活躍轉成活躍一定會收到更新。若是第2次從非活躍轉成活躍,且必須儲存的數據發生變化才會收到更新)
public class LiveDataMainActivity extends AppCompatActivity {
private NameViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.live_data_main_activity);
mViewModel = ViewModelProviders.of(this).get(NameViewModel.class);
Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(String newName) {
mName.setText(newName);
}
};
mViewModel.getCurrentName().observe(this, nameObserver);
}
}
3.Update LiveData objects
LiveData可以透過setValue和postValue方法來改變數據,2者的差別為setValue可用於main Thread,postValue可用於worker thread
String newName = "john doe";
mViewModel.getCurrentName().setValue(newName);
因此當setValue呼叫之後,所有已註冊且為活躍的observer便會觸發onChanged方法
Orignal From: LiveData 基本紀錄(Android Architecture Component)
0 意見:
張貼留言