【发布时间】:2016-03-31 10:27:07
【问题描述】:
我在我的应用程序中使用 Firebase 以及 RxJava。 Firebase 能够在后端数据发生更改(添加、删除、更改……)时通知您的应用。 我正在尝试将 Firebase 的功能与 RxJava 结合起来。
我正在侦听的数据称为 Leisure,Observable 发出 LeisureUpdate,其中包含 Leisure 和更新类型(添加、删除、移动、更改)。
这是我允许订阅此事件的方法。
private Observable<LeisureUpdate> leisureUpdatesObservable;
private ChildEventListener leisureUpdatesListener;
private int leisureUpdatesSubscriptionsCount;
@NonNull
public Observable<LeisureUpdate> subscribeToLeisuresUpdates() {
if (leisureUpdatesObservable == null) {
leisureUpdatesObservable = Observable.create(new Observable.OnSubscribe<LeisureUpdate>() {
@Override
public void call(final Subscriber<? super LeisureUpdate> subscriber) {
leisureUpdatesListener = firebase.child(FirebaseStructure.LEISURES).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final Leisure leisure = convertMapToLeisure((Map<String, Object>) dataSnapshot.getValue());
subscriber.onNext(new LeisureUpdate(leisure, LeisureUpdate.ADDED));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
final Leisure leisure = convertMapToLeisure((Map<String, Object>) dataSnapshot.getValue());
subscriber.onNext(new LeisureUpdate(leisure, LeisureUpdate.CHANGED));
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
final Leisure leisure = convertMapToLeisure((Map<String, Object>) dataSnapshot.getValue());
subscriber.onNext(new LeisureUpdate(leisure, LeisureUpdate.REMOVED));
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
final Leisure leisure = convertMapToLeisure((Map<String, Object>) dataSnapshot.getValue());
subscriber.onNext(new LeisureUpdate(leisure, LeisureUpdate.MOVED));
}
@Override
public void onCancelled(FirebaseError firebaseError) {
subscriber.onError(new Error(firebaseError.getMessage()));
}
});
}
});
}
leisureUpdatesSubscriptionsCount++;
return leisureUpdatesObservable;
}
首先,我想使用Observable.fromCallable() 方法来创建Observable,但我想这是不可能的,因为Firebase 使用回调,对吧?
我保留Observable 的单个实例,以便始终拥有一个Observable 可以订阅多个Subscriber。
当每个人都取消订阅并且我需要停止监听 Firebase 中的事件时,问题就出现了。
我无论如何都没有找到让Observable 了解是否还有订阅。所以我一直在计算我打了多少电话给subscribeToLeisuresUpdates(),leisureUpdatesSubscriptionsCount。
然后每次有人想退订它都必须打电话
@Override
public void unsubscribeFromLeisuresUpdates() {
if (leisureUpdatesObservable == null) {
return;
}
leisureUpdatesSubscriptionsCount--;
if (leisureUpdatesSubscriptionsCount == 0) {
firebase.child(FirebaseStructure.LEISURES).removeEventListener(leisureUpdatesListener);
leisureUpdatesObservable = null;
}
}
这是我发现让Observable 在有订阅者时发出项目的唯一方法,但我觉得必须有一种更简单的方法,特别是在没有更多订阅者收听可观察对象时理解。
有遇到过类似问题或有不同方法的人吗?
【问题讨论】:
-
另外,你可以使用我的图书馆rxFirebase