0

我有以下代码:

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,有时不会。我在这里做错了什么?我错过了什么 ?

4

1 回答 1

0
@Override
public Observable<String> fetchLocalCheckin() {
     return Observable.just(booking.getBookingId());
}

Observable.just(...). 这个触发恰好一次,onNext()紧接着是一个onComplete()。由于 MosbyMviBasePresenter遵循 Reactive 合同,该合同基本上说一旦onComplete()收到事件,整个流“结束”,这意味着CheckinOutView::fetchLocalCheckin唯一触发一次并且不能第二次调用(因为onComplete()已经触发)。

因此,如果您想多次触发此意图,请不要使用Observable.just(),而是使用PublishSubjector PublishRelay

即对于你的情况,这个只会在你的视图层(Fragment,Activity,ViewGroup)第一次创建时触发,但不会第二次触发,即屏幕方向更改后,因为第一次创建它Observale.just()会触发onComplete()阻止MviBasePresenter 接受未来的事件。

于 2017-06-19T20:57:51.850 回答