MaybeEmitter只运行一次,如何在订阅观察者后继续发送数据

时间:2018-02-11 07:27:34

标签: java android firebase-realtime-database rx-java2

我已经开始学习RxJava2了,我想知道为什么 我正在使用一个MaybeEmitter对象,它总是在调用onSuccess方法后处理。因此,来自Firebase的Profile对象的任何更改(调用侦听器onDataChange)都不会传递给我的Presenter,因为第二次调用e.onSuccess(profile),但没有任何事情发生**。即使在调用onComplete或OnSuccess方法后,有没有办法继续接收更新?

我的演示者:

 @Override
 public void loadUserProfileData(String userUid) {

        getCompositeDisposable().add(
            getDatabaseSource().getProfile(userUid)
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribeWith(new DisposableMaybeObserver<Profile>() {
                    @Override
                    public void onComplete() {
                        getView().goToLoginActivity();
                    }

                    @Override
                    public void onSuccess(Profile profile) {
                        getView().setUpProfileFields(profile);
                    }

                    @Override
                    public void onError(Throwable e) {
                        getView().showMessage(e.getLocalizedMessage());
                    }
                })
        );
    }

我的FirebaseDatabaseService:

 @Override
public Maybe<Profile> getProfile(final String uid) {
    return Maybe.create(
        new MaybeOnSubscribe<Profile>() {
            @Override
            public void subscribe(final MaybeEmitter<Profile> e) throws Exception {
                final DatabaseReference dataBaseProfile =
                        FirebaseDatabase.getInstance().getReference(USER_PROFILE).child(uid);
                dataBaseProfile.addValueEventListener(new ValueEventListener() {

                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        if (snapshot.exists()) {
                            Profile profile = null;
                            // There's always only one Profile object associated to each user
                            for(DataSnapshot dataSnapshot: snapshot.getChildren()){
                                profile = dataSnapshot.getValue(Profile.class);
                            }
                            e.onSuccess(profile);
                        } else {
                            e.onComplete();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Log.d("FIREBASE", databaseError.toString());
                        e.onError(databaseError.toException());
                    }
                });
            }
        }
    );
}

1 个答案:

答案 0 :(得分:3)

因为您正在使用Maybe而使用Observable

这是不同的RXjava2观察者。

  • 可观察

发出0或n项,并以成功或错误事件结束。

发出单个项目或错误事件。方法调用的反应版本。

  • 也许

成功处理项目,或没有项目或错误。 Optional的反应版本。

  • Completable

使用错误事件成功完成。它永远不会发出物品。 Runnable的反应版本。

了解 RxJava here