私はアンドロイド開発には初めてです。 現在、Rx androidでFirebase Realtime-Databaseを実装しています。 Rx Androidは、Realtime-Database内の特定の子ノードで発生した変更をリッスンし、その中のJavaクラスオブジェクトのリストを取得し、別のクラスで使用できるようにリストを返します。購読者はRx androidとFirebase Realtime Databaseインプリメンテーションで一度だけ呼び出されます
以下は私のコードスニペットです。
1)ここでは、読み取り、書き込み、更新、削除などの基本的なデータベース操作を行うクラスがありますが、現在は読み取り操作のみを示しています。ここ
public class FirebaseDatabaseLayer {
private DatabaseReference databaseReference = FirebaseDatabase
.getInstance().getReference();
private List<TodoComponentFirebase> todoComponentFirebases = new ArrayList<>();
private FirebaseUser user;
public Observable<List<TodoComponentFirebase>> readModelFirebase() {
return Observable.create(new Observable.OnSubscribe<List<TodoComponentFirebase>>() {
@Override
public void call(final Subscriber<? super List<TodoComponentFirebase>> subscriber) {
user = FirebaseAuth.getInstance().getCurrentUser();
databaseReference.child(user.getUid())
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
for (DataSnapshot todoComponentSnapshot: dataSnapshot.getChildren()) {
TodoComponentFirebase todoComponentFirebase = todoComponentSnapshot.getValue(TodoComponentFirebase.class);
todoComponentFirebases.add(todoComponentFirebase);
}
subscriber.onNext(todoComponentFirebases);
subscriber.onCompleted();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
for (DataSnapshot todoComponentSnapshot: dataSnapshot.getChildren()) {
TodoComponentFirebase todoComponentFirebase = todoComponentSnapshot.getValue(TodoComponentFirebase.class);
todoComponentFirebases.add(todoComponentFirebase);
}
subscriber.onNext(todoComponentFirebases);
subscriber.onCompleted();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});
}
2)数1クラスで定義された観測を聞くことを加入者を有するクラスである)readModelFirebase法内部
public class Presenter {
private FirebaseDatabaseLayer firebaseDatabaseLayer;
private Subscription readSubscriber = null;
public void readFirebaseModel() {
readSubscriber = firebaseDatabaseLayer
.readModelFirebase()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<TodoComponentFirebase>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext (List<TodoComponentFirebase> todoComponentFirebases) {
mainView.getFirebaseData(todoComponentFirebases);
}
});
}
}
ここでは2)のクラスは、にTodoComponentFirebaseのリストを渡しmainView.getFirebaseDataメソッドのパラメータ(私はここでこのメソッドの具体的な実装を示していません)。このアイデアは、それぞれの子ノードで変更が発生するたびに、mainView.getFirebaseDataメソッドがFirebaseデータベースに保存されているTodoComponentObjectのリストを取得するということです。
MainViewクラスはAppCompatActivityクラスで、Presenterクラス内のreadFirebaseMethod()はMainViewクラスのonCreateメソッドで呼び出されています。これはサブスクリプションの初期化として機能します。
MainViewクラスの初回初期化時に、readFirebaseModel()内のonNextが実行され、データはシームレスに取得されます。 しかし、1)クラスで定義されている子ノードに変更があっても、そのonNextメソッドには実行がありません。
子ノードで変更が発生したにもかかわらず、サブスクリプションが機能しない理由はわかりません。子ノードが初期化されている間だけ機能しました。私のRxの使用方法に欠けているものはありますか?
おかげ