LiveData 基本紀錄(Android Architecture Component)

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 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews