Android Architecture Components(4)

原创
2017/12/06 07:30
阅读数 44

这篇主要讲LiveData,LiveData是一个可观察数据的持有类,不同于常见的可观察类,LiveData具有生命周期敏感性。也就是说,LiveData可以关联应用组件的生命周期,例如Activity,Fragment,Service等,这种关联保证LiveData只在可用的生命周期状态下更新观察其的应用组件。


LiveData简介

在一定情况下,我们可以认为LiveData就是一个可观察者,当组件茶语STARTED或RESUMED状态时,其被激活,一一种Observer类的形式呈现。LiveData只会通知处于活动状态的观察者更新,非活动状态的观察者不会接收到数据更新。

我们可以通过注册一个Observer对象与实现了LifeCycleOwner接口的类进行配对,这种配对关系允许当LifeCycleOwner走向DESTROYED时移除Observer。这种操作对Activity和Fragment是非常实用的,这样Activity和Fragment就可以根据需求订阅LiveData变化而且不需要担心内存泄漏。

LiveData的优势

  • UI和数据状态的同步:LiveData遵循的是观察者模式,当数据状态发生变化时,LiveData通知观察者,此时你可以考虑在这些观察者对象内进行UI更新,而不是每次应用数据变化时都去更新,换句话说就是避免了相同数据的多次拉取和UI更新;

  • 不用担心内存泄漏:LiveData与他们对应的生命周期对象配对,当生命周期对象被销毁时,它们所占有的资源也会被释放;

  • Activity Finish时应用不会奔溃:如果LiveData所绑定的生命周期对象处于不可用状态,那么就不会接收到数据更新的通知;

  • 不需要手动处理生命周期:UI组件只需要关注数据,LiveData会自动监听所绑定的生命周期对象的变化;

  • 数据更新即时:如果绑定的生命周期对象重新激活,它将接收到最新的数据;

  • 适应设置变化:在设置发生变化引起Activity或Fragment重建时,重建的Activity或Fragment能力可收到最新的数据;

  • 共享资源:可以实现一个单例模式的LiveData与系统服务绑定,此时可以在你的应用内共享LiveDat的所有数据;

LiveData的使用

一般创建LiveData需要三步:
1.创建持有数据的LiveData对象,通常在ViewModel中处理;
2.创建一个观察者并定义他的onChanged()方法;
3.使用observer()方法绑定LiveData和观察者。

我们也可以通过observerForver(Observer) 去向一个不具备生命周期的对象注册观察者,此时观察者将被永远视为激活状态。可以通过removeObserver(Observer)移除观察者。

这里假设这样一种情形:界面上有一个Button和一个TextView,在Button点击时,更新TextView上的姓名。

创建持有数据的LiveData对象

public class UserNameViewModal extends ViewModel {
   private MutableLiveData<String> mUserName;
   public MutableLiveData<String> getCurrentUserName(){
       if (mUserName == null) {
           mUserName = new MutableLiveData<String>();
       }
       return mUserName;
}
}

对于LiveData而言,我们一般使用它的实现类MutableLiveData

观察LiveData对象

final Observer<String> userNameObserver = new Observer<String>() {
   @Override
   public void onChanged(@Nullable String s) {
       mTextView.setText(s);
   }
};

当然这里也有ViewModel 的初始化,上篇推文中已经详细介绍过,这里不再赘述。
绑定观察者和LiveData

mUserNameViewModal.getCurrentUserName().observe(this,userNameObserver);

随后在Button的点击事件中更新LiveData的值就可以了

mButton.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       index++;
       String otherName = "John"+ index;
       mUserNameViewModal.getCurrentUserName().setValue(otherName);
   }
});

上面代码中我们可以看到,当需要更新LiveData值的时候,我们可以使用setValue(T) 和postValue(T)这两个函数,其中postValue(T)一般用于工作线程。

该例子的运行效果如下:

由上述例子我们可以看出一个简单的LiveData工作流图,如下所示:

Activity Observer LiveData内容变化,当LiveData数据变化时通知Activity,此时Activity更新UI。


关于Architecture Components的更多详情敬请关注后续推文。




本文分享自微信公众号 - 小海编码日记(gh_1f87b8c00ede)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部