首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 架构组件 LiveData 的实现

本文由授权投稿

作者博客:https://jekton.github.io/

本篇我们来看看 Android 架构组件中的 LiveData 。跟 ViewModel 相比,LiveData 具有生命周期感知能力,也就是说,他把 ViewModel 和 lifecycle 结合了起来。当应用的数据有更新时,一般我们仅希望应用对用户可见时才更新 UI;更进一步,如果应用不可见,我们甚至可以停止数据的更新。这就是所谓的“感知应用的生命周期”。

这里我们主要关注 LiveData 的实现,用法可以参考 Google 的教程[1]。

以下源码使用 1.1.1 版本

添加 Observer

使用 LiveData 时,首先要做的,就是添加一个 Observer。

由于 LiveData 是一个 abstract class,我们不能直接生成他的实例。对于数据的拥有者,可以使用 MutableLiveData:

所谓数据的拥有者。举个例子,你使用的是 MVP 模式,那么数据就属于 Model 层,另外两层不应该修改数据。

通过让这两个 setter 方法成为 protected,只要我们给客户返回的是 LiveData,就不用担心数据会被客户意外修改:

活用 public, protected, private, default access 和 final 可以让我们的设计意图更加清晰。

现在回到我们的 observe() 方法,observeForever 的实现跟 observe 是类似的,我们就不看了,这里只看 observe():

我们继续看 LifecycleBoundObserver:

到这里,observer 的注册我们就看完了。下面我们看看如何发布(publish)数据给 LiveData。

发布修改

要修改 LiveData,有两种方式:

setValue 比较简单,我们先看 setValue:

看过我那篇 lifecycle 源码分析的读者应该对 dispatchingValue 处理循环调用的方式很熟悉了。以这里为例,为了防止循环调用,我们在调用客户代码前先置位一个标志(mDispatchingValue),结束后再设为 false。如果在回调里面又触发了这个方法,可以通过 mDispatchingValue 来检测。

检测到循环调用后,再设置第二个标志(mDispatchInvalidated),然后返回。返回又会回到之前的调用,前一个调用通过检查 mDispatchInvalidated,知道数据被修改,于是开始一轮新的迭代。

下面是 considerNotify:

看完了 setValue,postValue 对我们来说就很简单了:

LiveData 的核心代码我们已经看完了,其实它的实现也挺简单的,对吧?

总结

关于 LiveData,有两个值得我们学习的,一个是循环调用的处理,另一个是 mVersion 的使用。关于 mVersion,这里再举一个之前工作中遇到的例子。

在后台线程对数据进行持久化的时候(这个线程拷贝了一份数据),数据还有可能会被更新。为了判断所保存的数据是不是最新的,我当时的做法就是引入一个类似 mVersion 的东西,每次修改数据,都把 mVersion 加 1。通过比较 mVersion 和所保存的数据的 version,就能够知道是不是保存了最新的数据(当然,更好的做法是告诉后台线程数据已经修改,让他重新拿一次数据)。

附:

[1]https://developer.android.google.cn/topic/libraries/architecture/

— — — END — — —

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180717G0C3HK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券