我已实施以下行为:
Presenter会观察事件的用户界面
UI事件触发异步操作
异步操作完成后,结果将设置为ViewModel。
ViewModel被发送到View以更新状态
这会产生单向数据流 - 易于管理。
ViewModel和Presenter在方向更改后存活,状态不会丢失。
我的实施:
主讲人:
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));
}
}
此实现工作正常,它作为一个流连接。 但是这段代码中有一个错误。在配置更改期间,异步操作的结果会丢失,因为flatMap中的流正在与外部流一起处理。
在从Observable视图中取消订阅时,是否可以将flatservable保留在flatMap中?换句话说,只处理flatMap的上游?
我创建了单独的流,一个用于异步任务,另一个用于观察视图,它符合我的所有要求,但它似乎是不洁净的设计。