我有以下代码:
public class CheckoutPresenter extends CheckinOutPresenter {
@Inject
public CheckoutPresenter(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread, OnlineBookingRepository onlineBookingRepository, OfflineBookingRepository offlineBookingRepository, ImageRepository imageRepository) {
super(threadExecutor, postExecutionThread, onlineBookingRepository, offlineBookingRepository, imageRepository);
}
@Override
protected void bindIntents() {
Observable<CheckinOutViewState> checkinViewStateObservable =
intent(CheckinOutView::fetchLocalCheckin)
.switchMap(uuid -> offlineBookingRepository.fetchCheckoutById(uuid, false)) <-- Here sometimes get called, sometimes not
.subscribeOn(Schedulers.from(threadExecutor))
.map(CheckinOutViewState.SuccessLocalFetch::new)
.cast(CheckinOutViewState.class)
.onErrorReturn(CheckinOutViewState.ErrorStateOut::new)
.observeOn(postExecutionThread.getScheduler());
Observable<CheckinOutViewState> sendCheckin =
intent(CheckinOutView::sendCheckin)
.switchMap(checkinIntent -> imageRepository.saveImage(checkinIntent.getFilename(), checkinIntent.getSignature())
.subscribeOn(Schedulers.from(threadExecutor))
.filter(cnhImageResponse -> cnhImageResponse.getLinks() != null)
.switchMap(response -> {
CheckinOutCommand command = checkinIntent.getCheckinOutCommand();
command.setSignatureUrlImage(response.getLinks().getUrl());
return onlineBookingRepository.doCheckout(command).subscribeOn(Schedulers.from(threadExecutor));
})
.subscribeOn(Schedulers.from(threadExecutor))
.map(CheckinOutViewState.SentSuccessfuly::new)
.cast(CheckinOutViewState.class)
.startWith(new CheckinOutViewState.LoadingStateOut())
.doOnError(error -> offlineBookingRepository.doCheckout(checkinIntent.getCheckinOutCommand()))
.doOnComplete(() -> offlineBookingRepository.deleteCheckoutById(checkinIntent.getCheckinOutCommand().getBookingId(), false))
.onErrorReturn(CheckinOutViewState.ErrorStateOut::new))
.observeOn(postExecutionThread.getScheduler());
subscribeViewState(Observable.merge(checkinViewStateObservable, sendCheckin), CheckinOutView::render);
}
}
它继承自:
public abstract class CheckinOutPresenter extends MviBasePresenter<CheckinOutView, CheckinOutViewState> {
protected final ThreadExecutor threadExecutor;
protected final PostExecutionThread postExecutionThread;
protected final OnlineBookingRepository onlineBookingRepository;
protected final OfflineBookingRepository offlineBookingRepository;
protected final ImageRepository imageRepository;
CheckinOutPresenter(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread, OnlineBookingRepository onlineBookingRepository, OfflineBookingRepository offlineBookingRepository, ImageRepository imageRepository) {
this.threadExecutor = threadExecutor;
this.postExecutionThread = postExecutionThread;
this.onlineBookingRepository = onlineBookingRepository;
this.offlineBookingRepository = offlineBookingRepository;
this.imageRepository = imageRepository;
}
}
@Override
public Observable<String> fetchLocalCheckin() {
return Observable.just(booking.getBookingId());
}
但问题是,有时 fetchLocalCheckin 被触发,有时不会。我在这里做错了什么?我错过了什么吗?
@Override
public Observable<String> fetchLocalCheckin() {
return Observable.just(booking.getBookingId());
}
Observable.just(...)
.这个恰好触发一次onNext()
紧接着是onComplete()
。由于 Mosby 的MviBasePresenter
遵循响应式合约,该合约基本上说一旦收到onComplete()
事件,整个流就会"完成",这意味着CheckinOutView::fetchLocalCheckin
只触发一次,不能第二次调用(因为onComplete()
已经被触发了(。
因此,如果您想多次触发此意图,请不要使用 Observable.just()
而是使用 PublishSubject
或 PublishRelay
.
即在您的案例中,这个只会在第一次创建视图层(片段、活动、视图组(时触发,但不会第二次触发,即在屏幕方向更改后,因为第一次创建它Observale.just()
触发onComplete()
这会阻止 MviBasePresenter 接受未来的事件。