小编典典

何时在 Android 中使用 RxJava,何时使用 Android Architectural Components 中的 LiveData?

all

我没有理由在 Android 中使用 RxJava 和从 Android Architectural Components 中使用
LiveData。如果用示例说明两者之间的用例和差异以及解释两者之间差异的示例示例,那将非常有帮助。


阅读 55

收藏
2022-06-10

共1个答案

小编典典

Android LiveData 是原始观察者模式的变体,增加了活动/非活动转换。因此,它的范围非常有限。

使用Android
LiveData
中描述的示例,创建一个类来监视位置数据,并根据应用程序状态注册和取消注册。

RxJava 提供了更通用的操作符。让我们假设这个 observable 将提供位置数据:

Observable<LocationData> locationObservable;

Observable.create()可以使用映射回调操作来构建 observable 的实现。当 observable
被订阅时,回调被注册,当它被取消订阅时,回调被取消注册。该实现看起来与示例中提供的代码非常相似。

我们还假设您有一个在应用程序处于活动状态时发出 true 的 observable:

Observable<Boolean> isActive;

然后您可以通过以下方式提供 LiveData 的所有功能

Observable<LocationData> liveLocation =
  isActive
    .switchMap( active -> active ? locationObservable : Observable.never() );

操作员将switchMap()提供当前位置作为流,或者如果应用程序未处于活动状态,则不提供任何内容。一旦你有了liveLocationobservable,你可以使用
RxJava 操作符来做很多事情。我最喜欢的例子是:

liveLocation.distinctUntilChanged()
  .filter( location -> isLocationInAreaOfInterest( location ) )
  .subscribe( location -> doSomethingWithNewLocation( location ) );

那只会在位置改变并且位置有趣时执行操作。您可以创建组合时间运算符以确定速度的类似操作。更重要的是,您可以使用 RxJava
运算符详细控制操作是否发生在主线程、后台线程或多个线程中。

RxJava 的重点在于它将控制和计时组合到一个单一的宇宙中,使用库提供的操作,甚至是您提供的自定义操作。

LiveData 只涉及该领域的一小部分,相当于构建liveLocation.

2022-06-10