0

我使用 Mosby 得到了以下代码。

分段:

@Override
public Observable<CardInfo> loadCardIntent() {
    return Observable.just(new CardInfo(cardselected, PreferenceManager.getDefaultSharedPreferences(getContext())
            .getBoolean(PreferencesVariables.SHOW_BACK_CARD.toString(), false)))
            //.delay(500, TimeUnit.MILLISECONDS)
            .doOnNext(showBack -> Log.d(TAG, "Show card back: " + showBack));
 }

@Override
 public Observable<CardInfo> loadFrontIntent() {
        return RxView.clicks(cardBackImageView)
                .map(showFront -> new CardInfo(cardselected, false))
                .doOnNext(showFront -> Log.d(TAG, "Show card front"));
}

@Override
public Observable<Boolean> hideCardIntent() {
        return clicks(cardFrontImageView)
                .map(ignored -> true)
                .doOnNext(close -> Log.d(TAG, "Close card activity"));
}

主持人:

@Override
    protected void bindIntents() {

        Observable<CardViewState> showSelectedCard = intent(CardView::loadCardIntent)
                .switchMap(cardInfo -> interactor.getCard(cardInfo))
                .doOnError(error -> System.out.print(error.getMessage()));

        Observable<CardViewState> showFront = intent(CardView::loadFrontIntent)
                .switchMap(cardInfo -> interactor.getCard(cardInfo))
                .doOnError(error -> System.out.print(error.getMessage()));

        Observable<CardViewState> hideCard = intent(CardView::hideCardIntent)
                .switchMap(ignored -> interactor.hideCard());

        Observable<CardViewState> intents = Observable.merge(showSelectedCard, showFront, hideCard)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());

        subscribeViewState(intents, CardView::render);
    }

分段:

@Override
public void render(CardViewState viewState) {
    if (viewState instanceof CardViewState.CardBackState) {
        renderCard(R.raw.planningpoker_rueckseite, cardBackImageView);
        renderCard(((CardViewState.CardBackState) viewState).card, cardFrontImageView);
        showCardBack();
    } else if (viewState instanceof CardViewState.CardFrontState) {
        renderCard(R.raw.planningpoker_rueckseite, cardBackImageView);
        renderCard(((CardViewState.CardFrontState) viewState).card, cardFrontImageView);
        showCardFront();
    } else if (viewState instanceof CardViewState.CardCloseState) {
        getActivity().finish();
    }
}

交互者:

Observable<CardViewState> getCard(CardInfo cardInfo) {
    return cardInfo.showBack ? Observable.just(new CardViewState.CardBackState(CARDS[cardInfo.card])) :
            Observable.just(new CardViewState.CardFrontState(CARDS[cardInfo.card]));
}

Observable<CardViewState> hideCard() {
    return Observable.just(new CardViewState.CardCloseState());
}

没有 - 方法的延迟不会loadCardIntent()render()CardBackState 触发。但我不想使用任意延迟来确保触发正确的方法。有没有其他方法可以确保所有事件都被发出?

谢谢您的帮助。

4

3 回答 3

0

嗯,你的代码在 github 上的某个地方可用吗?到目前为止,一切似乎都很好。也许这是一个内部 mosby 错误。如果您subscribeOn(schdulers.io())在演示者 bind() 方法中添加到 loadCardIntent() 是否有效。我看到的唯一区别delay​()是您的代码运行同步(在主 UI 线程上),而delay()将代码的执行切换到后台线程。您确定您的 interactor.getCardInfo() 是为了在 androids 主 UI 线程上运行吗?即,如果它在主线程上运行,但您正在执行 http 请求(在主 UI 线程上),则会引发异常。您是否在交互器中捕获异常?

于 2017-05-01T09:55:04.990 回答
0

这是一个 mosby 内部问题,现已修复。

https://github.com/sockeqwe/mosby/issues/242

请使用最新快照:

com.hannesdorfmann.mosby3:mvi:3.0.4-SNAPSHOT

(请参阅README)以验证现在一切都按预期工作。

如果它解决了您的问题,请评论链接的 github 问题。谢谢。

于 2017-05-08T14:43:09.947 回答
0

我现在的解决方案是使用Schedulers.trampoline(). 这并不理想,也不够,但它让我摆脱了更麻烦的延迟。

Schedulers.trampoline()似乎正在解决的问题是更改到另一个线程需要很短的时间。这会导致事件丢失。所以留在同一个线程上可以解决这个问题。

于 2017-05-19T06:22:38.530 回答