Android架构组件—LiveData

前言

LiveData 是一个可以保存数据和观察数据变化的组件。他是被设计用来在ViewModel中保存数据,

但是同样也可以在应用的其他地方使用。

LiveData使用观察者模式监听数据的改变。这与RxJava的Observable非常类似,但是LiveData不止于此,LiveData是具有生命周期感知能力的。

简单的说,LiveData只是一个普通的数据类型,但是当数据发生变化时,它能够通知其观察者。

添加LiveData

添加google maven仓库

allprojects {    repositories {        jcenter()        google()    }}

添加依赖

dependencies {    // ViewModel and LiveData    implementation "android.arch.lifecycle:extensions:1.1.1"    // alternatively, just ViewModel    implementation "android.arch.lifecycle:viewmodel:1.1.1"    // alternatively, just LiveData    implementation "android.arch.lifecycle:livedata:1.1.1"    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"}

Java8支持

dependencies {    // Java8 support for Lifecycles    implementation "android.arch.lifecycle:common-java8:1.1.1"}

创建LiveData对象

可以把LiveData想象成一个可以与任何数据一起使用的包装器,包括集合对象,列如:List。LiveData对象通常存储在ViewModel对象中,并通过getter方法访问。

public class NameViewModel extends ViewModel {// 创建一个包含String的LiveDataprivate MutableLiveData mCurrentName;public MutableLiveData getCurrentName() {      if (mCurrentName == null) {          mCurrentName = new MutableLiveData();      }        return mCurrentName;    }}

上面代码并没有给LiveDta设置Value,Value的来源可以是WebService或者本地数据库。

使用LiveData对象

public class NameActivity extends AppCompatActivity {    private NameViewModel mModel;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 获取ViewModel实例        mModel = ViewModelProviders.of(this).get(NameViewModel.class);        // 创建更新UI的观察者        final Observer nameObserver = new Observer() {            @Override            public void onChanged(@Nullable final String newName) {                // 更新UI                mNameTextView.setText(newName);            }        };        // 观察LiveData        mModel.getCurrentName().observe(this, nameObserver);    }}

上面代码展示了如果监听一个LiveData对象,并切如果LiveDta没有调用setValue方法,那么onChanged方法也不会回调。

扩展LiveData

如果观察者的生命周期处于STARTEDRESUMED状态,则LiveData会认为观察者处于活动状态。

public class StockLiveData extends LiveData<BigDecimal> {    private StockManager mStockManager;    private SimplePriceListener mListener = new SimplePriceListener() {        @Override        public void onPriceChanged(BigDecimal price) {            setValue(price);        }    };    public StockLiveData(String symbol) {        mStockManager = new StockManager(symbol);    }    @Override    protected void onActive() {        mStockManager.requestPriceUpdates(mListener);    }    @Override    protected void onInactive() {        mStockManager.removeUpdates(mListener);    }}

上面例子中包含3个重要的方法:

  • onActive() :当LiveData依附在observer上时调用
  • onInactive() :当LiveData不在依附在observer上时调用
  • setValue(T):更新LiveData实例的值并通知观察者

转换LiveData

您可能想对存储在LiveData对象中的值进行更改后再分配给观察者,或者您可能需要根据另一个LiveData实例返回不同的LiveData实例。Lifecycle软件包提供Transformations类,其中就包括支持这些场景的方法。

Transformations.map()

在LiveData使用这个方法可以改变其下游的结果

LiveData userLiveData = ...;LiveData userName = Transformations.map(userLiveData, user -> {    user.name + " " + user.lastName});

Transformations.switchMap()

类似于map,使用这个方法同样可以改变下游的结果,传递给switchMap()的函数必须返回一个LiveData对象

private LiveData getUser(String id) {  ...;}LiveData userId = ...;LiveData user = Transformations.switchMap(userId, id -> getUser(id) );

参考

https://developer.android.com/topic/libraries/architecture/livedata

其他

Android架构组件(Architecture Components)介绍

Android架构组件—LiveData

Android架构组件—ViewModel

Android架构组件Room的使用

更多相关文章

  1. android 页面初始化时让组件得不到焦点
  2. android app启动流程解析
  3. Android(安卓)Context对象
  4. Android的Broadcast Receicer解析
  5. Android安卓布局简介
  6. Android(安卓)开发四大天王 四大组件 (很简洁,很明晰)
  7. [Android] ExpandableListView 子目录点击不响应,解决
  8. ExpandableListView 怎么和其他组件相互整合布局
  9. Android菜鸟笔记3-Activity切换

随机推荐

  1. HTML-Canvas的优越性能以及实际应用
  2. 函数参数及返回值、模板字面量及模板函数
  3. Android(安卓)- 永不锁屏,开机不锁屏,删除
  4. Android实现手势滑动(左滑和右滑)
  5. Android(安卓)LayoutInflater 源码分析
  6. 【demo记录】极光推送(android app访问服
  7. ubuntu下eclipse配置android SDK
  8. 【Android】添加菜单和监听菜单方法详解
  9. Android(安卓)LocationManager 使用
  10. Android图片轮播控件---com.youth.banner