我已经开始学习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());
}
});
}
}
);
}
答案 0 :(得分:3)
因为您正在使用Maybe
而使用Observable
。
这是不同的RXjava2观察者。
发出0或n项,并以成功或错误事件结束。
发出单个项目或错误事件。方法调用的反应版本。
成功处理项目,或没有项目或错误。 Optional的反应版本。
使用错误事件成功完成。它永远不会发出物品。 Runnable的反应版本。
了解 RxJava here