2017-09-10 2 views
0

DBからデータを取得するためにNodeにN回追加されたFirebase childEventListenerを使用しています。ChildEventListenerの削除

今、childEventListenerを削除しようとしていますが、動作していないようで、重複するデータがあります。

query = FirebaseDatabase.getInstance().getReference() 
      .child("chat") 
      .child("room-messages") 
      .child(roomID) 
      .orderByChild("timestamp") 
      .limitToLast(index); 

    paginationListener = query.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Log.d(TAG, dataSnapshot.getKey() + " - Single Value"); 
      try { 
       Message message = dataSnapshot.getValue(Message.class); 
       message.setId(dataSnapshot.getKey()); 
       EventBus.getDefault().post(new GetPaginatedMessage(message)); 
      } catch (RuntimeException e) { 
       Log.d(TAG, "Type Cast Exception Caught"); 
      } 

     } 

if (query != null && paginationListener != null) { 
     query.removeEventListener(paginationListener); 
    } 

のようにリスナーを削除することが動作するようには思えないし、私は重複データを取得します。 ヘルプが充実しています

+0

'removeEventListener()を呼び出すと、その場所からリスナーが削除されます。すでに受信したデータの完了後、イベントの発生を停止します。それでもリスナーに電話がかかっている場合は、あなたが共有したコードから言うと残念ながら不可能なことが起こっています。 –

+0

うん、https://groups.google.com/forum/#!topic/firebase-talk/qBPLgP35QPsは私がここでやっていることと密接に関連している!代替案の考え方は?私ももっとコードを共有することができます –

+0

そのfirebaseトークスレッドJonnyは、「データがすでに受信された後に完了した」と同じことを話します。それ以上のデータを処理したくない場合は、リスナーを削除するときにbooleanフラグを設定し、処理前に 'onChildAdded'の値をチェックしてください。 –

答えて

2

removeEventListener()を呼び出すと、その場所からリスナーが削除されます。それはあなたがそれを呼び出した後に受け取ったデータのイベントを発生させません。既に受信したデータに対しては、まだイベントが発生する可能性があります。これと同じ動作に関する

Jonny's answer on the firebase-talk group

イベントは、別のスレッドで実行する非同期および潜在的にキューに入れられているので、あなたがにremoveEventListenerを呼び出す前にしてのイベントはキューに入れられたかもしれませんが。