RxJava2处理流的一部分
我实现了以下行为:RxJava2处理流的一部分,java,android,rx-java2,Java,Android,Rx Java2,我实现了以下行为: 演示者观察事件的用户界面 UI事件触发异步操作 异步操作完成后,结果将设置为ViewModel ViewModel被发送到视图以更新状态 这导致了单向数据流,易于管理 ViewModel和Presenter保留方向更改,状态不会丢失 我的实施: 演示者: public class Presenter { private final MainViewModel viewModel = new MainViewModel(); private final Inte
public class Presenter {
private final MainViewModel viewModel = new MainViewModel();
private final Interactor interactor;
private final CompositeDisposable viewDisposables = new CompositeDisposable();
private MainActivity view;
public Presenter(Interactor interactor) {
this.interactor = interactor;
}
void onCreateView(MainActivity view) {
this.view = view;
viewDisposables.addAll(onGetResult(), listenToViewModelUpdates());
}
void onDestroyView() {
viewDisposables.clear();
view = null;
}
private Disposable onGetResult() {
return view.clickObservable()
.flatMap(__ -> Observable.fromCallable(interactor::doWork)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))
.subscribe(result -> {
viewModel.result = result;
viewModel.sendUpdate();
});
}
private Disposable listenToViewModelUpdates() {
return viewModel.observe().subscribe(viewModel -> view.update(viewModel));
}
}
此实现工作正常,它作为一个流连接。
但是这段代码中有一个bug。在配置更改期间,异步操作的结果将丢失,因为flatMap中的流将与外部流一起处理
在取消订阅视图“可观察”时,是否可以保持flatMap内的“可观察”处于活动状态?换句话说,仅在flatMap的上游进行处理
我创建了单独的流,一个用于异步任务,另一个用于观察视图,它符合我的所有要求,但它似乎是不干净的设计。配置更改是否真的意味着不再需要安装下游操作的结果?不,我需要在后台保存该任务,并无论如何检索操作的结果。例如,若你们想完成付款,并且你们旋转屏幕,你们需要得到关于付款操作结果的通知,否则你们将不知道实际发生了什么。这种操作不能重复。在这种情况下,我认为你的付款应该是独立的可观察的,而不是一个平面图。看看这个链接是否有帮助:好的,谢谢。实际上,我已经将其作为单独的流实现了,并且效果很好。我只是想确定没有更好的方法可以做到这一点。考虑到您的设置,我希望分离流实现是更好的方法。也许你不需要将它与所有类型的事件分开,但对于你描述的特定事件,它肯定是这样的。配置更改是否真的意味着你不再被安装在任何下游操作的结果中?不,我需要将该任务保存在后台,并无论如何检索操作的结果。例如,若你们想完成付款,并且你们旋转屏幕,你们需要得到关于付款操作结果的通知,否则你们将不知道实际发生了什么。这种操作不能重复。在这种情况下,我认为你的付款应该是独立的可观察的,而不是一个平面图。看看这个链接是否有帮助:好的,谢谢。实际上,我已经将其作为单独的流实现了,并且效果很好。我只是想确定没有更好的方法可以做到这一点。考虑到您的设置,我希望分离流实现是更好的方法。也许你不需要在所有类型的事件中都将其分开,但对于你描述的特定事件,它肯定是这样的。