关于原问题,RxJava和LiveData互为补充,相得益彰。
LiveData
在ViewModel层上表现出色,它与Android生命周期和ViewModel
的紧密集成使其更具优势。而RxJava
在变换方面提供了更多的功能(正如@Bob Dalgleish所提到的)。
目前,我们在数据源和存储库层使用RxJava
,并将其转换为LiveData
(使用LiveDataReactiveStreams
)在ViewModels中(在向活动/片段公开数据之前) - 对此方法感到非常满意。
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之间存在许多差异:
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
中清除它们会更好。 - SnicolasLiveData
并不是与RxJava
本质上不同的工具,那么为什么要将其引入架构组件,而RxJava
仅需在一个CompositeDispoable
对象中存储所有可观察对象的订阅,并在Activity
的onDestroy()
或Fragment
的onDestroyView()
中使用一行代码即可处理生命周期?LiveData
,当RxJava可以通过将所有订阅存储在CompositeDisposable
中,并在Activity
的onDestroy()
中进行处理,从而轻松管理生命周期。实际上,LiveData
会在onStop
中处理清理工作。 - arekolek如您所知,在反应式生态系统中,我们有一个Observable来发出数据并有一个Observer订阅(获取通知)这个Observable的发射,这就是所谓的观察者模式的工作方式。 Observable“喊出”一些东西,观察者被通知在给定的时刻可知道Observable喊出了什么。
将LiveData
视为一个Observable,它允许您管理处于active
状态的Observers。换句话说,LiveData
是一个简单的Observable,同时也负责生命周期。
但让我们看看您请求的两种代码情况:
A) LiveData
B) RXJava
A)这是LiveData的基本实现
1) 通常会在ViewModel中实例化LiveData以保持方向更改(您可以拥有只读的LiveData或可写的MutableLiveData,因此通常从类外公开LiveData)
2) 在Main Activity的OnCreate
方法中(而不是ViewModel),您会“订阅”一个Observer对象(通常是onChanged方法)
3) 启动observe方法以建立链接
首先是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) 声明Observable
2) 声明Observer
3) 使用Observer订阅Observable
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 中的每个更改,以便在需要的位置实时管理事件。强烈建议了解生命周期概念及其相关对象LifeCycleOwner / LifeCycle,同时建议查看Transformations,如果想要在现实场景中实现LiveData
。在这里,您可以从 commonsware 中找到一些用例。
总之,基本上 LiveData
是简化版的 RXJava
,一种优雅的方式可以观察多个组件的变化,而无需在组件之间创建显式的所谓依赖关系规则,因此您可以更轻松地测试代码并使其更易读。
RXJava 允许您做 LiveData 的事情,还可以做更多的功能。由于 RXJava 具有扩展功能,因此您既可以为简单情况使用 LiveData,也可以利用 RXJava 的所有功能继续使用 Android 架构组件,例如ViewModel,当然这意味着 RXJava
可能会复杂得多,想象一下它拥有数百个操作符,而 LiveData 目前只有 SwitchMap 和 Map。
RXJava 2 版本是一种革命性的库,为面向对象范式添加了所谓的函数式方式来管理程序流程。
LiveData是由安卓团队开发的安卓架构组件的一部分。
通过使用LiveData和其他架构组件,架构组件会处理内存泄漏和其他类似问题。由于它是由安卓团队开发的,因此最适合安卓使用。他们还提供更新以处理新版本的安卓。
如果您只想在安卓应用程序开发中使用,那么请选择安卓架构组件。否则,如果您想使用其他Java应用程序,如Web应用程序、桌面应用程序等,请使用RxJava。
LiveData部分等同于Rx Subject或SharedRxObservable
LiveData管理订阅的生命周期,但是Rx Subject的订阅必须手动创建和处理
LiveData没有终止状态,但是Rx Subject有OnError和OnCompleted
LiveData
是一个数据持有者,仅此而已。我们也可以说LiveData
是生命周期感知的消费者。强烈建议了解生命周期概念和相关对象LifeCycleOwner/LifeCycle,您可以获得业务逻辑的转换和流能力,并为您的UI提供生命周期感知操作。
Rx是一个强大的工具,可以以优雅的声明式风格解决问题。它处理业务方面的选项或服务API操作。
将LiveData与RxJava进行比较就像将苹果与水果沙拉进行比较。
将LiveData与ContentObserver进行比较就像将苹果与苹果进行比较。LiveData有效地取代了ContentObserver,具有生命周期感知功能。
将RxJava与AsyncTask或任何其他线程工具进行比较就像将水果沙拉与橙子进行比较,因为RxJava不仅帮助处理线程问题。
observeOn
,因为LiveDataReactiveStreams
会通过调用LiveData.postValue()
自动实现这一点。同时,在一般情况下,使用subscribeOn
也不能保证起到任何效果。 - arekolek