RxAndroid:onCompleted没有被调用

时间:2018-02-01 08:09:13

标签: android rx-java rx-android

我在我的应用程序中使用rx库在我的服务器上调用一些REST api并在屏幕上显示结果。 我也遵循MVP设计模式。所以我有一个Presenter和一个Interactor类。 在MainInteractor.java中,我有以下方法:

public Observable<Card> fetchCard(final String clientId, final CardFetchedListener listener) {
        Log.i(TAG, "FetchCard method");

        // Manipulate the observer
        return CARDS
                .doOnCompleted(new Action0() {
                    @Override
                    public void call() {
                        Log.d(TAG, "CARDS Completed");
                    }
                })
                .flatMap(new Func1<Card, Observable<Card>>() {
                    @Override
                    public Observable<Card> call(final Card card) {

                        return ResourceClient.getInstance(card)
                                .getIDCard()
                                .observeOn(AndroidSchedulers.mainThread())
                                .doOnError(new Action1<Throwable>() {
                                    @Override
                                    public void call(Throwable throwable) {
                                        Log.w(TAG, "interactor -> fetchCard 2", throwable);
                                        }
                                    }
                                })
                                .flatMap(new Func1<CardMeta, Observable<Card>>() {
                                    @Override
                                    public Observable<Card> call(CardMeta cardMeta) {
                                        card.setCardMeta(cardMeta);
                                        saveOrUpdateCardToTheDb(card);
                                        return Observable.just(card);
                                    }
                                })
                                .doOnCompleted(new Action0() {
                                    @Override
                                    public void call() {
                                        Log.d(TAG, "Completed body");
                                    }
                                });
                    }
                });
    }

在日志中,我可以看到“已完成的正文”字符串。

以下方法由MainPresenter.java类调用,如下所示:

interactor.fetchCard(clientId, this)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Card>() {
                        @Override
                        public void onCompleted() {
                            Log.i(TAG, "fetchCard onCompleted");
                            view.hideProgressDialog();
                            view.updateCardsAdapter(cards);
                        }

                        @Override
                        public void onError(Throwable e) {
                            Log.e(TAG, "Fetch Card error ", e);
                            onFailure(parseThrowable(e));
                        }


                        @Override
                        public void onNext(Card card) {
                            if (card != null) {
                                Log.i(TAG, card.getTenant() + " was fetched and will be displayed");
                            }
                        }
                    });

问题是Presenter类中的onCompleted方法永远不会被调用。我试图自己调用完成它并且它有效,但问题是当观察者已完成发射卡片时我实际上并不知道。

我在这里做错了什么?

更新

CARDS也是包含元信息的可观察对象。它使用

初始化
Observable.from(tenants)
.filter(...).flatMap(// I'm using create operator here and it is calling its onCompleted method successflly);

0 个答案:

没有答案