我没有从Android架构组件中获得在Android和LiveData中使用RxJava的理由。如果以代码的形式解释用例和两者之间的差异,以及解释两者之间差异的示例示例,将会非常有帮助。
当前回答
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操作符详细控制操作是发生在主线程、后台线程还是多个线程中。
RxJava的重点在于,它使用库提供的操作,甚至您提供的自定义操作,将控制和计时结合到一个单一的领域。
LiveData只处理了其中的一小部分,相当于构建了liveLocation。
其他回答
LiveData部分等于Rx Subject或SharedRxObservable LiveData管理订阅的生命周期,但Rx主题 订阅应该手动创建和处理 LiveData没有终止状态,但Rx Subject有OnError 和oncomplete
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操作符详细控制操作是发生在主线程、后台线程还是多个线程中。
RxJava的重点在于,它使用库提供的操作,甚至您提供的自定义操作,将控制和计时结合到一个单一的领域。
LiveData只处理了其中的一小部分,相当于构建了liveLocation。
事实上,LiveData与RxJava并不是本质上不同的工具,那么当RxJava可以通过将所有订阅的可观察对象存储在CompositeDispoable对象中,然后将它们处理在Activity的onDestroy()或Fragment的onDestroyView()中,只使用一行代码时,为什么要将它作为架构组件引入?
通过使用RxJava构建一个电影搜索应用程序,然后在这里使用LiveData,我已经完全回答了这个问题。
But in short, yes, it could, but that would need first overriding the relevant lifecycle methods besides having the basic lifecycle knowledge. This still might not make sense for some, but the fact is that according to one of the Jetpack sessions in Google I/O 2018 many developers find lifecycle management complex. The crash errors arising from not handling lifecycle dependence might be another sign that some developers, even if knowledgable of lifecycle, forget to take care of that in every Activity / Fragment they use in their app. In large apps this could become an issue, notwithstanding the negative effect it could have on productivity.
The bottom line is that by introducing LiveData , larger number of developers are expected to adopt MVVM without even having to understand the lifecycle management, memory leak and crash. Even though I have no doubt that LiveData is not comparable with RxJava in terms of capabilities and the power it gives to developers, reactive programming and RxJava is a hard-to-understand concept and tool for many. On the other side, I do not think LiveData is meant to be a replacement for RxJava–it simply cannot–but a very simple tool for handling a controversial widespread issue experienced by many developers.
**更新** 我在这里添加了一篇新文章,解释了滥用LiveData会导致意想不到的结果。RxJava可以在这些情况下发挥作用
比较LiveData和RxJava就像比较苹果和水果沙拉。
比较LiveData和contenttobserver,你是在比较苹果和苹果。LiveData有效地替代了contenttobserver的生命周期。
将RxJava与AsyncTask或任何其他线程工具进行比较,就像将水果沙拉与橙子进行比较一样,因为RxJava帮助的不仅仅是线程。
LiveData只是数据持有者而已。我们也可以说LiveData是具有生命周期意识的消费者。强烈建议LiveData了解生命周期的概念和相关对象LifeCycleOwner/ lifecycle,您可以获得业务逻辑的转换和流功能,以及UI的生命周期感知操作。
Rx是一个强大的工具,能够以优雅的声明式风格解决问题。它处理业务端选项或服务Api操作
推荐文章
- 如何以编程方式将视图添加到视图
- 单击url会打开默认浏览器
- 使用Retrofit刷新OAuth令牌,而不修改所有调用
- 多个dex文件定义了landoid /support/v4/accessibilityservice/AccessibilityServiceInfoCompat
- 如何获得动作栏的高度?
- 从活动外部调用startActivity() ?
- createScaledBitmap的过滤器参数做什么?
- 为什么我在使用adb时访问数据文件夹被拒绝?
- 如何确定Android设备的GPS是否已启用
- 没有找到与给定名称匹配的资源:attr 'android:keyboardNavigationCluster'。更新到支持库26.0.0时
- 禁用在android中打开导航抽屉的滑动手势
- Android:允许平板电脑竖屏和横屏,但强制手机竖屏?
- 如何使布局与视图填充剩余的空间?
- 字符串资源新行/n不可能?
- 如何点击或点击一个TextView文本