2017-01-11 5 views
1

私はアンドロイド開発には初めてです。 現在、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の使用方法に欠けているものはありますか?

おかげ

答えて

0

あなたはonCompleted()加入者がfirebase上の任意の子イベントの後に再び呼ば終わるとしません呼び出すときに私は思う

subscriber.onCompleted(); 

を削除してみてください。

関連する問題