Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Android SDK
Code

 Android架构组件:LiveData

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Android Architecture Components.
Android Architecture Components: Lifecycle and LiveModel
Android Architecture Components: the Room Persistence Library

Chinese (Simplified) (中文(简体)) translation by Muhamad Zulfiqor (you can also view the original English article)

 我们已经在Android架构组件系列中介绍了很多内容。我们开始讨论新架构背后的想法 并查看Google I / O中提供的关键组件。  在第二篇文章中,我们开始深入探索包的主要组件,仔细研究LifecycleLiveModel组件。  在这篇文章中,我们将继续探索架构组件,这次分析了令人敬畏的LiveData组件。

 我假设您熟悉上一个教程中涵盖的概念和组件,如LifecycleLifecycleOwnerLifecycleObserver。如果你不是,请看看本系列的第一篇文章,在那里我将讨论新Android架构及其组件背后的一般概念。

 我们将继续构建我们在本系列的最后一部分开始的示例应用程序。您可以在教程GitHub repo中找到它。

 1. LiveData组件

 LiveData是数据持有者。它能够被观察,它可以保存任何类型的数据,并且最重要的是,它还具有生命周期意识。实际上LiveData可以配置为仅在其观察者处于活动状态时发送数据更新。  由于其生命周期意识,当LifecycleOwner观察时,LiveData组件将仅在观察者的生命周期仍处于活动状态时发送更新,并且一旦观察者的生命周期被破坏,它将移除观察到的关系。

 LiveData组件有许多有趣的特性:

  •  当观察者绑定到生命周期时,可以防止内存泄漏
  • prevents crashes due to stopped activities
  •  数据始终是最新的
  •  平稳处理配置更改
  •  使共享资源成为可能
  •  自动处理生命周期

 2.观察LiveData

 LiveData组件仅在其观察者处于“活动”状态时才发送数据更新。  当LifecycleOwner观察时,LiveData组件认为观察者只有在其生命周期处于STARTEDRESUMED状态时才处于活动状态,否则它会将观察者视为非活动状态。  在观察者处于非活动状态期间,LiveData将停止数据更新流,直到其观察者再次变为活动状态。如果观察者被销毁,LiveData将删除其对观察者的引用。

LiveData update flow

 要实现此行为,LiveData会在LifecycleOwner观察时与观察者的生命周期建立紧密的关系。在观察LiveData时,此容量可以更轻松地避免内存泄漏。  但是,如果在没有LifecycleOwner的情况下调用观察过程,则LiveData组件将不会对Lifecycle状态做出反应,并且必须手动处理观察者的状态。

 要观察LiveData,请调用observe(LifecycleOwner,Observer )observeForever(Observer )

  •  observe(LifecycleOwner,Observer ):这是观察LiveData的标准方法。它将观察者绑定到生命周期,根据LifecycleOwner当前状态更改LiveData的活动和非活动状态。
  •  observeForever(Observer<T>):此方法不使用LifecycleOwner,因此LiveData将无法响​​应Lifecycle事件。使用此方法时,调用removeObserver(Observer <T>)非常重要,否则观察者可能无法进行垃圾回收,从而导致内存泄漏。

 3.实现LiveData

 LiveData<T>类中的泛型类型定义了将要保留的数据类型。例如,LiveData 保存位置数据。或者LiveData 包含一个String

 组件实现中必须考虑两种主要方法:onActive()onInactive()。两种方法都对观察者的状态作出反应。

 示例实现

 在我们的示例项目中,我们使用了大量的LiveData对象,但我们只实现了一个:LocationLiveData。该课程处理GPS定位,仅为活跃的观察者传递当前位置。 Notice that the class updates its value on the onLocationChanged method, passing to the current active observer the refreshed Location data.

4. The MutableLiveData Helper Class

 MutableLiveData<T> 是一个扩展LiveData的助手类,并公开postValuesetValue方法。除此之外,它的行为与其父母完全一样。  要使用它,请定义它所拥有的数据类型,如MutableLiveData<String> 以保存String,并创建新实例。

 要向观察者发送更新,请调用postValue或setValue。这些方法的行为非常相似;但是,setValue将直接设置一个新值,并且只能从主线程调用,而postValue在主线程上创建一个新任务来设置新值,并且可以从后台线程调用。

 重要的是要考虑到,因为postValue方法在主线程上创建一个新的Task并发布,所以它比直接调用setValue要慢。

 5. LiveData的转换

 最终,您需要更改LiveData并将其新值传播给其观察者。  或者您可能需要在两个LiveData对象之间创建链式反应,使一个对另一个对象的更改作出反应。要处理这两种情况,您可以使用Transformations类。

 地图转换

 Transformations.mapLiveData实例上应用函数,并将结果分派给其观察者,使您有机会操纵数据值。

Transformationsmap flow

 实现Transformations.map非常容易。您所要做的就是提供要观察的LiveData和观察到的LiveData更改时要调用的函数,记住函数必须返回已转换的LiveData的新值。

 假设您有一个LiveData,当String值(如搜索字段)发生更改时,必须调用API。

 SwitchMap转换

 Transformations.switchMapTransformations.map非常相似,但它必须返回一个LiveData对象。它有点难用,但它可以让你构建强大的连锁反应。

 在我们的项目中,我们使用Transformations.switchMapLocationLiveDataApiResponse 之间创建反应。

  1.  我们的Transformation.switchMap观察到LocationLiveData的变化。
  2.  LocationLiveData更新值用于调用MainRepository以获取指定位置的天气。
  3.  存储库调用OpenWeatherService结果生成LiveData >
  4.  然后,返回的LiveDataMediatorLiveData观察,MediatorLiveData负责修改接收的值并更新视图层中显示的天气。

 但请注意LiveData转换中耗时的操作。在上面的代码中,两个Transformations方法都在主线程上运行。

 6. MediatorLiveData

 MediatorLiveData是一种更高级的LiveData类型。它具有与Transformations类非常相似的功能:它能够对其他LiveData对象做出反应,在观察到的数据发生变化时调用Function。  但是,与转换相比,它具有许多优点,因为它不需要在主线程上运行,并且可以一次观察多个LiveData

 要观察LiveData,请调用addSource(LiveData ,Observer ),使观察者对给定LiveData中的onChanged方法做出反应。要停止观察,请调用removeSource(LiveData )

 在我们的项目中,包含要展示的天气的视图层观察到的数据是MediatorLiveData。该组件观察另外两个LiveData对象:weatherByLocationResponse,它按位置接收天气更新,weatherByCityResponse,按城市名称接收天气更新。  每次更新这些对象时,weatherByCityResponse将使用请求的当前天气更新视图层。

 在MainViewModel中,我们观察LiveData并提供要查看的天气对象

 在MainActivity中,观察天气并向用户显示其结果。

 MediatorLiveData还用作处理对OpenWeatherMap API的调用的对象的基础。看看这个实现;它比上面的更先进,值得研究。  如果您有兴趣,请查看OpenWeatherService,特别注意Mediator<T> 类。

 7.结论

 我们几乎即将探索Android的架构组件。到现在为止,您应该了解足以创建一些强大的应用程序。  在下一篇文章中,我们将探讨Room,一个包装SQLite并可以生成LiveData结果的ORMRoom组件非常适合这种架构,它是拼图的最后一部分。

 再见!在此期间,请查看我们在Android应用开发上的其他一些帖子!

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.