介绍
LiveData 是一款基于观察者模式的可感知生命周期的核心组件。LiveData 为界面代码 (Observer)的监视对象
(Observable),当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。同时,LiveData 持有
界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed
时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。通过 LiveData,开发者可以方便地构建安全性更高、
性能更好的高响应度用户界面 .
https://developer.android.google.cn/topic/libraries/architecture/livedata.html
使用必知
推荐在 ViewModel , 而不是在 Activity / Fragment 中保存 LiveData 对象
- 防止 Activity / Fragment 过于臃肿, 这些 UI 控制器只负责显示数据, 而不负责保存数据.
- 将 LiveData 实例与 Activity / Fragment 实例分离, 使得 LiveData 对象在 Activity / Fragment 实例销毁时仍能保存数据.
观察/订阅 LiveData 对象的最佳时机是 onCreate() 方法中
- 防止因 Activity / Fragment 的 onStart() / onResume() 多次回调, 导致 LiveData 多次被 observe
- 确保 Activity / Fragment 一旦变成活跃状态,就有可展示的数据
LiveData 使用
一般按照以下步骤:
-
在 ViewModel 类中, 创建 LiveData 的实例, 用来保存指定类型的数据.
/** * 实现每隔一秒钟,调用 postValue() 设置一次数据 */ // step1 public class TimerViewModel extends ViewModel { private static final String TAG = "TimerViewModel"; private static final int ONE_SECOND = 1000; private MutableLiveData<Long> mutableLiveData = new MutableLiveData<>(); private final Long initTime; public TimerViewModel() { initTime = SystemClock.elapsedRealtime(); new Timer().schedule(new TimerTask() { @Override public void run() { long num = (SystemClock.elapsedRealtime() - initTime) / 1000; // setValue()会抛出异常 : Cannot invoke setValue on a background thread mutableLiveData.postValue(num); } }, ONE_SECOND, ONE_SECOND); } public MutableLiveData<Long> getMutableLiveData() { return mutableLiveData; } /** * 当 Activity 或 Fragment 销毁时,会回调该方法 */ @Override protected void onCleared() { super.onCleared(); Log.e(TAG, "onCleared: "