Answers:
Android LiveData是原始观察者模式的变体,增加了活动/非活动过渡。因此,它的范围是非常严格的。
使用Android LiveData中描述的示例,将创建一个类来监视位置数据,并根据应用程序状态进行注册和注销。
RxJava提供了更为通用的运算符。假设此可观察对象将提供位置数据:
Observable<LocationData> locationObservable;
可以使用Observable.create()
可映射的回调操作来构建可观察对象的实现。当观察对象被订阅时,回调被注册,而当它被取消订阅时,回调被取消注册。该实现看起来与示例中提供的代码非常相似。
我们还假设您有一个当应用程序处于活动状态时发出true的Observable:
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的要点是,它使用库中提供的操作甚至您提供的自定义操作将控制和时序组合到一个Universe中。
LiveData仅解决该Universe的一小部分,相当于构建liveLocation
。
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide.
但是LiveData生命周期并不知道。如果我们要使用Rx,我们是否必须处理生命周期更改?
关于最初的问题,RxJava和LiveData确实很好地互补。
LiveData
与Android生命周期和紧密集成,在ViewModel层上大放异彩ViewModel
。RxJava
提供更多的转换功能(如@Bob Dalgleish所述)。
当前,我们正在RxJava
数据源和存储库层中LiveData
使用它,并将其转换为LiveDataReactiveStreams
ViewModels中的(使用)(在将数据暴露给活动/碎片之前)-对这种方法非常满意。
observeOn
,LiveDataReactiveStreams
通过打电话来做到LiveData.postValue()
。并且不能保证您subscribeOn
总体上会有任何效果。
LiveData和RxJava之间有许多区别:
public class RegistrationViewModel extends ViewModel {
Disposable disposable;
private RegistrationRepo registrationRepo;
private MutableLiveData<RegistrationResponse> modelMutableLiveData =
new MutableLiveData<>();
public RegistrationViewModel() {
}
public RegistrationViewModel(RegistrationRepo registrationRepo) {
this.registrationRepo = registrationRepo;
}
public void init(RegistrationModel registrationModel) {
disposable = registrationRepo.loginForUser(registrationModel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<RegistrationResponse>>() {
@Override
public void accept(Response<RegistrationResponse>
registrationModelResponse) throws Exception {
modelMutableLiveData.setValue(registrationModelResponse.body());
}
});
}
public LiveData<RegistrationResponse> getModelLiveData() {
return modelMutableLiveData;
}
@Override
protected void onCleared() {
super.onCleared();
disposable.dispose();
}
}
onCleared
。
其实,LiveData
不是本质的不同工具RxJava
,那么,为什么它推出了作为一个架构组件时RxJava
,所有订阅储存的可观的可以很容易地管理生命周期的 CompositeDispoable
对象,然后在释放他们onDestroy()
的Activity
或者onDestroyView()
在中Fragment
只使用一个代码行?
通过使用RxJava一次构建一个电影搜索应用程序,然后在此处使用LiveData,我已经完全回答了这个问题。
简而言之,可以,但是除了拥有基本的生命周期知识外,还需要首先覆盖相关的生命周期方法。对于某些人来说,这可能仍然没有意义,但事实是,根据Google I / O 2018中的Jetpack会话之一,许多开发人员发现生命周期管理很复杂。由不处理生命周期依赖性引起的崩溃错误可能是另一个迹象,即即使开发人员知道生命周期,也忘记在他们的应用程序中使用的每个Activity / Fragment中都照顾好它。在大型应用程序中,这可能会成为一个问题,尽管它可能会对生产力产生负面影响。
最重要的是,通过引入LiveData
,有望使更多的开发人员采用MVVM,甚至无需了解生命周期管理,内存泄漏和崩溃。即使我毫不怀疑,这在功能和赋予开发人员的功能,反应式编程方面LiveData
都无法与之相比,RxJava
并且RxJava
是许多人难以理解的概念和工具。另一方面,我认为这并不是LiveData
要替代RxJava
它(它根本不可能),而是解决许多开发人员所遇到的有争议的广泛问题的非常简单的工具。
**更新**我在这里添加了一篇新文章,其中我解释了滥用LiveData如何导致意外结果。在这种情况下,RxJava可以营救
LiveData
会onStop
实际
如您所知,在反应生态系统中,我们有一个Observable发出数据,一个Observer订阅(获得通知)这种Observable发射,所谓的Observer Pattern的工作原理并不奇怪。一个可观察的“喊”某事,观察者得到通知,在给定的时刻可观察的喊某事。
认为LiveData
是一个Observable,可让您管理处于某种active
状态的Observer 。在其他方面LiveData
是一个简单的可观察,但也需要在生命周期的服务。
但是,让我们看看您请求的两种代码情况:
A)实时数据
B)接收Java
A)这是LiveData的基本实现
1)您通常在ViewModel中实例化LiveData以维护方向更改(您可以使用只读的LiveData或可写的MutableLiveData,因此通常将LiveData类暴露在外部)
2)在Main Activity(不是ViewModel)的OnCreate
方法中,您“订阅”一个Observer对象(通常是onChanged方法)
3)您启动方法观察建立链接
首先ViewModel
(拥有业务逻辑)
class ViewModel : ViewModel() { //Point 1
var liveData: MutableLiveData<Int> = MutableLiveData()
}
这是MainActivity
(尽可能愚蠢的)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ViewModelProvider= ViewModelProviders.of(this).get(ViewModel::class.java)
ViewModelProvider.observe(this, Observer {//Points 2 and 3
//what you want to observe
})
}
}
}
B)这是RXJava的基本实现
1)您声明一个可观察的
2)您声明一个观察者
3)您向观察者订阅观察者
Observable.just(1, 2, 3, 4, 5, 6) // Point 1
.subscribe(new Subscriber() { //Points 2 & 3
@Override
public void onCompleted() {
System.out.println("Complete!");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Double value) {
System.out.println("onNext: " + value);
}
});
特别LiveData
是与架构组件Lifecycle
一起使用,并且经常与ViewModel
(如我们所见)一起使用。实际上,当LiveData
与ViewModel结合使用时,您可以实时更新Observer中的每个更改,以便在需要的地方实时管理事件。LiveData
强烈建议您使用该工具以了解生命周期的概念以及相关对象LifeCycleOwner / LifeCycle,如果您想在现实生活中实现,我也建议您看一下TransformationsLiveData
。在这里,您可以从通用软件中找到一些用例。
为了总结起来主要LiveData
是简化的RXJava
观察在多个成分的变化,而无需创建组件之间明确的所谓的相关性规则,一个优雅的方式,这样就可以测试更容易的代码,使之更具可读性。RXJava,允许您执行LiveData的操作以及更多操作。由于RXJava的扩展功能,您既可以将LiveData用于简单的情况,也可以利用RXJava的所有功能继续使用Android体系结构组件作为 ViewModel,当然这意味着RXJava
要复杂得多,只要考虑拥有数百个运算符即可SwitchMap和LiveData的地图(目前)。
RXJava版本2是一个库,它彻底改变了面向对象的范例,增加了一种所谓的功能方式来管理程序流程。
LiveData是android团队开发的android体系结构组件的子集。
对于实时数据和其他体系结构组件,内存泄漏和其他类似问题由体系结构组件处理。由于它是由android团队开发的,因此最适合android。他们还提供处理新版本Android的更新。
如果您只想在Android应用程序开发中使用,请使用Android体系结构组件。否则,如果要使用其他Java应用程序(例如Web应用程序,桌面应用程序等),请使用RxJava