我没有理由在Android中使用RxJava,也没有理由从Android架构组件中使用LiveData.如果以代码的形式解释二者之间的用例和差异,并以示例的形式解释二者之间的差异,这将非常有用.

推荐答案

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

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

RxJava提供了更加通用的运算符.让我们假设此可观测对象将提供位置数据:

Observable<LocationData> locationObservable;

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

我们还假设,当应用程序处于活动状态时,您有一个发出true的可观测值:

Observable<Boolean> isActive;

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

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

switchMap()操作员将以流的形式提供当前位置,如果应用程序未激活,则不提供任何内容.一旦你有了liveLocation个可观察对象,你就可以用RxJava操作符做很多事情了.我最喜欢的例子是:

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

它只会在位置发生变化且位置有趣时执行操作.您可以创建类似的操作

RxJava的要点在于,它使用库提供的操作,甚至使用您提供的自定义操作,将控制和计时组合到一个世界中.

LiveData只处理了宇宙中的一小部分,相当于构建liveLocation个.

Android相关问答推荐

Android编写动画在发布版本中崩溃

Android Studio -未显示布局预览(不推荐使用安全管理器)

原始mp3文件不显示与proguard

如何在初始合成期间在可组合函数中调用/获取远程API中的数据[防止无限重组]

为什么可以';我不能直接在RecyclerView.ViewHolder中访问视图ID吗?

Android 12+BLE字节不同

Android 中 recyclerview 的自定义分隔线 colored颜色 不起作用

错误:参数的类型必须是用@Entity注释的类或其集合/array. java.lang.String tocd);

为什么 Android Studio 中的 theme.xml 目录没有任何原色

如何在Android中使用嵌套的Recyclerview

如何从 firebase 实时数据库中检索最后一个值

列表更改时,RecyclerView 中的列表不会更新

发布 MAUI 应用程序时出现遇到重复程序集错误

如何添加到先前预填充的 Room 数据库?

Jetpack Compose 部分或开放侧边框

每次在 Jetpack Compose 中调用导航

MediumTopAppBar Material3 只更改大标题

无法 HEAD 'https://jcenter.bintray.com/com/facebook/react/react-native/maven-metadata.xml'

Unity:Android 上随机接近零的 FPS 下降(提供了很多线索)

设备文件资源管理器-ROOM 数据库中的数据库文件夹为空