有一段時間,在B站那裡刷視頻的時候,無意刷到一個德生的收音機視頻。突然讓我想起了我的中學時代,我的中學時代是在收音機的陪伴之下成長的。那個時候,主要的想法是為了收聽短波的英文電臺,美名日學習英語。不過那個時候,能清晰聽到的英文廣播電臺並不多,更多的是外國播放的中文廣播電臺,而這些電臺大多數是說國內的 ...
LiveData LiveData是基於觀察者模式創建的,其中,LiveData是被觀察者,觀察者通過註冊方法,監聽被觀察者的數據變化。LiveData在數據發生變化的時候,會通知觀察者。 LiveData是一個容器,存放數據的容器,它的數據變化可以被監聽,也就是LiveData是一個被觀察者,如下,創建了一個存放String的數據容器currentName:
public class NameViewModel extends ViewModel { // Create a LiveData with a String private MutableLiveData<String> currentName; public MutableLiveData<String> getCurrentName() { if (currentName == null) { currentName = new MutableLiveData<String>(); } return currentName; } // Rest of the ViewModel... }監聽LiveData數據變化,為LiveData添加觀察者,如下,添加一個nameObserver,監聽LiveData的數據變化,當LiveData的數據發生變化的的時候,onChanged方法會被回調,從而更新UI。
public class NameActivity extends AppCompatActivity { private NameViewModel model; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Other code to setup the activity... // Get the ViewModel. model = new ViewModelProvider(this).get(NameViewModel.class); // Create the observer which updates the UI. final Observer<String> nameObserver = new Observer<String>() { @Override public void onChanged(@Nullable final String newName) { // Update the UI, in this case, a TextView. nameTextView.setText(newName); } }; // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer. model.getCurrentName().observe(this, nameObserver); } }更新LiveData數據的方式,使用setValue和postValue兩個方法 LiveData發佈修改有setValue和postValue兩種方式,其中setValue只能在主線程調用,postValue則沒有這個限制
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String anotherName = "John Doe"; model.getCurrentName().setValue(anotherName); } });應用架構中的LiveData LiveData 具有生命周期感知能力,遵循 activity 和 fragment 等實體的生命周期。您可以使用 LiveData 在這些生命周期所有者和生命周期不同的其他對象(例如 ViewModel 對象)之間傳遞數據。ViewModel 的主要責任是載入和管理與界面相關的數據,因此非常適合作為用於保留 LiveData 對象的備選方法。您可以在 ViewModel 中創建 LiveData 對象,然後使用這些對象向界面層公開狀態。 activity 和 fragment 不應保留 LiveData 實例,因為它們的用途是顯示數據,而不是保持狀態。此外,如果 activity 和 fragment 無需保留數據,還可以簡化單元測試的編寫。 擴展LiveData 如果觀察者的生命周期處於 STARTED 或 RESUMED 狀態,LiveData 會認為該觀察者處於活躍狀態。以下示例代碼說明瞭如何擴展 LiveData 類
public class StockLiveData extends LiveData<BigDecimal> { private StockManager stockManager; private SimplePriceListener listener = new SimplePriceListener() { @Override public void onPriceChanged(BigDecimal price) { setValue(price); } }; public StockLiveData(String symbol) { stockManager = new StockManager(symbol); } @Override protected void onActive() { stockManager.requestPriceUpdates(listener); } @Override protected void onInactive() { stockManager.removeUpdates(listener); } }當LiveData對象具有活躍觀察者時, 會調用 onActive() 方法。這意味著,您需要從此方法開始觀察股價更新。 當 LiveData 對象沒有任何活躍觀察者時,會調用 onInactive() 方法。由於沒有觀察者在監聽,因此沒有理由與 StockManager 服務保持連接。 setValue(T) 方法將更新 LiveData 實例的值,並將更改告知活躍觀察者。 LiveData使用總結
- 創建LiveData,使用viewModel類來包含
- 創建觀察者Observer
- 調用LiveData的observe方法將LiveData以及Observer建立起發佈-訂閱關係
- 在適當的時機調用LiveData的setValue或者postValue發佈新數據通知觀察者
- configuration changes時,不需要額外的處理來保存數據我們知道,當你把數據存儲在組件中時,當configuration change(比如語言、屏幕方向變化)時,組件會被recreate,然而系統並不能保證你的數據能夠被恢復的。當我們採用LiveData保存數據時,因為數據和組件分離了。當組件被recreate,數據還是存在LiveData中,並不會被銷毀。
public interface Observer<T> { /** * Called when the data is changed. * @param t The new data */ void onChanged(@Nullable T t); } // 註意,他是 abstract class public abstract class LiveData<T> { // 只有 onStart 後,對數據的修改才會觸發 observer.onChanged() public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {} // 無論何時,只要數據發生改變,就會觸發 observer.onChanged() public void observeForever(@NonNull Observer<T> observer) {} }
版權聲明: 作者:ttylinux 出處:http://www.cnblogs.com/ttylinux/ 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。