rah*_*l66 158 android rx-android reactive rx-java2 android-architecture-components
我没有理由在Android中使用RxJava,在Android Architectural Components中使用LiveData.如果两者之间的用例和差异以及代码形式的示例示例进行解释,这将解释两者之间的差异,这将非常有用.
Bob*_*ish 106
Android LiveData是原始观察者模式的变体,添加了活动/非活动过渡.因此,其范围非常严格.
使用Android LiveData中描述的示例,创建一个类来监视位置数据,并根据应用程序状态注册和取消注册.
RxJava提供了更加通用的运算符.我们假设这个observable将提供位置数据:
Observable<LocationData> locationObservable;
Run Code Online (Sandbox Code Playgroud)
可以使用Observable.create()映射回调操作来构建observable的实现.订阅observable时,将注册回叫,并且当取消订阅时,将取消注册回叫.该实现看起来与示例中提供的代码非常相似.
我们还假设您有一个在应用程序处于活动状态时发出true的observable:
Observable<Boolean> isActive;
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过以下方式提供LiveData的所有功能
Observable<LocationData> liveLocation =
isActive
.switchMap( active -> active ? locationObservable : Observable.never() );
Run Code Online (Sandbox Code Playgroud)
所述switchMap()操作者将或者提供的当前位置作为流,或没有,如果应用程序未激活.一旦你有了liveLocationobservable,你可以使用RxJava运算符做很多事情.我最喜欢的例子是:
liveLocation.distinctUntilChanged()
.filter( location -> isLocationInAreaOfInterest( location ) )
.subscribe( location -> doSomethingWithNewLocation( location ) );
Run Code Online (Sandbox Code Playgroud)
这只会在位置发生变化时执行操作,并且位置很有趣.您可以创建组合时间运算符以确定速度的类似操作.更重要的是,您可以使用RxJava运算符提供对主线程,后台线程或多线程中是否发生操作的详细控制.
RxJava的重点在于它将控制和计时结合到单个Universe中,使用库提供的操作,甚至是您提供的自定义操作.
LiveData只处理该Universe的一小部分,相当于构建该Universe liveLocation.
kzo*_*tin 94
关于原始问题,RxJava和LiveData都非常好地相互补充.
LiveData在ViewModel层上闪耀,与Android生命周期紧密集成ViewModel.RxJava提供了更多的转换功能(如@Bob Dalgleish所述).
目前,我们正在使用RxJava数据源和存储库层,并将其转换为LiveData(使用LiveDataReactiveStreams)ViewModels(在将数据暴露给活动/片段之前) - 对此方法非常满意.
Abh*_*mar 50
LiveData和RxJava之间存在许多差异
所以这里的问题是,你为什么要在第一时间使用LiveData? 正如您在下面的代码中所看到的,您将响应从Rxjava存储到MutableLiveData(或LiveData),并且您的LiveData可识别生命周期,因此在某种程度上,您的数据可识别生命周期.现在,想象一下当您的数据本身知道何时以及何时更新UI时的可能性.
LiveData没有历史记录(只是当前状态).因此,您不应将LiveData用于聊天应用程序.
将LiveData视为数据持有者而不是其他内容.我们还可以说LiveData是生命周期感知的消费者.
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();
}
}
Run Code Online (Sandbox Code Playgroud)Ali*_*Nem 28
其实,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可以来救援
tro*_*tto 24
正如您在反应式生态系统中所知,我们有一个发出数据的Observable和一个订阅(获得通知)此Observable发射的观察者,没有什么奇怪的是如何工作所谓的观察者模式.一个Observable"喊"一些东西,Observer得到通知Observable在特定时刻喊出一些东西.
认为LiveData是一个Observable,允许您管理处于active状态的观察者.在其他方面LiveData是一个简单的可观察,但也需要在生命周期的服务.
但是让我们看看你要求的两个代码案例:
A)实时数据
B)RXJava
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()
}
Run Code Online (Sandbox Code Playgroud)
这就是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
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
B)这是RXJava的基本实现
1)你宣布一个Observable
2)你宣布一个观察者
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);
}
});
Run Code Online (Sandbox Code Playgroud)
特别LiveData是Lifecycle与ViewModel(并且经常)(如我们所见)架构组件一起使用.实际上,当LiveData与ViewModel结合使用时,您可以实时更新Observer中的每个更改,以便在需要的地方实时管理事件.LiveData强烈建议使用生命周期的概念和相关对象LifeCycleOwner/LifeCycle,如果你想在现实生活场景中实现,我建议你看看转换LiveData.在这里你可以找到一些伟大的commonswear的用例.
包裹起来基本上LiveData是一个简化的RXJava观察在多个成分的变化,而无需创建组件之间明确的所谓的相关性规则,这样就可以测试更容易的代码,使其更具可读性,一种优雅的方式.RXJava,允许你做LiveData的事情等等.由于RXJava的扩展功能,您既可以使用LiveData来处理简单的情况,也可以利用RXJava的所有功能继续使用Android架构组件作为 ViewModel,当然这意味着RXJava可以更加复杂,只需要考虑运营商的hundreads SwitchMap和LiveData地图(目前).
RXJava版本2是一个彻底改变面向对象范式的库,它添加了一种所谓的功能方式来管理程序流.
LiveData 是由 android 团队开发的 android 架构组件的子集。
对于实时数据和其他架构组件,内存泄漏和其他类似问题由架构组件处理。由于它是由 android 团队开发的,因此它是 android 的最佳选择。他们还提供处理新版本 Android 的更新。
如果您只想在 Android 应用程序开发中使用,请选择 Android 架构组件。否则,如果您想使用其他 Java 应用程序,如 Web 应用程序、桌面应用程序等,请使用 RxJava
| 归档时间: |
|
| 查看次数: |
35781 次 |
| 最近记录: |