有时不被解雇的意图



我有以下代码:

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() 而是使用 PublishSubjectPublishRelay .

即在您的案例中,这个只会在第一次创建视图层(片段、活动、视图组(时触发,但不会第二次触发,即在屏幕方向更改后,因为第一次创建它Observale.just()触发onComplete()这会阻止 MviBasePresenter 接受未来的事件。

相关内容

最新更新