2017-11-03 96 views
-5

我想在我的onPause方法中如下所示離開活動時刪除我的ChildEventListener觀察者。基本上我的問題是,當我離開活動並返回到它時,我的childListener得到一個增量,這取決於我離開活動並返回它的次數,我的System.out.println將打印到控制檯「onChildAdded」和「onChildRemoved」多次,我只希望它被調用一次。如何當我離開活動結束我的聽衆任何幫助,謝謝提前:)android firebase stop ChildEventListener

// Connect to DB 
private DatabaseReference mDataBase; 
private FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
String currentUser_UID = mAuth.getCurrentUser().getUid(); 
ChildEventListener childListener; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

    mDataBase = FirebaseDatabase.getInstance().getReference(); 
    childListener = mDataBase.child("Users").addChildEventListener(new ChildEventListener() { 

     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      String savedCardUser = (String) dataSnapshot.child("Card").getValue(); 
      System.out.println("onChildAdded"); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
      System.out.println("onChildRemoved"); 
     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     mDataBase.removeEventListener(childListener); 
    } 

編輯

如果它不是簡單的事情:)不得不添加子( )路徑現在工作完美。成功刪除我的聽衆

mDataBase.child("Card").removeEventListener(childListener); 
+0

你的問題的問題不是要阻止任何事情。這是爲了防止它從以前的實例恢復...爲什麼你需要這個? –

+0

因爲當onChildRemoved被觸發時,我正在從我的數組列表中刪除一個元素,並且因爲它被多次調用,所以它從我的數組列表中刪除多於1個項目,然後崩潰,因爲它正在尋找刪除的索引不存在:) –

+0

問題中沒有Arraylist。請顯示實際問題的[mcve] –

回答

0

您好,如果您的情況下不需要添加子事件偵聽器。你可以只使用一個簡單的單個事件偵聽器將觸發一次,所以一旦被觸發,將不會再次觸發

這樣做

上創建的方法是做的最好的地方你案例:

//in on create method do that 

//this is your database reference 
mDataBase = FirebaseDatabase.getInstance().getReference(); 

//add single event listener like that 

mDataBase.addListenerForSingleValueEvent(new ValueEventListener(){ 

//in data change method you do the rest of your code 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot){ 

    String savedCardUser = (String) dataSnapshot.child("Card").getValue(); 
    System.out.println("onChildAdded"); 

    } 

    //on canceled....... 

}); 

這隻會觸發一次(當您的活動創建時),而且您不必擔心刪除偵聽器。

編輯

好了,所以如果孩子事件偵聽器觸發,當你返回到你的活動,這意味着您要連接監聽器中(的onResume)或(在onStart)。如果這是你所做的,那麼這就是問題所在,因爲在你返回給他們的活動中,onstart會觸發然後繼續等等...但是(onCreate)不會在(onCreate)中附加子事件監聽器,你不會再有問題了。

這樣做:

//in on create 

    mDataBase = FirebaseDatabase.getInstance().getReference(); 
    childListener = mDataBase.child("Users").addChildEventListener(new ChildEventListener() { 

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    String savedCardUser = (String) dataSnapshot.child("Card").getValue(); 
    System.out.println("onChildAdded"); 
} 

//and in pause keep the same code (remove the child listener) 

EDIT 2

好吧,我給你刪除偵聽超級調用後這樣做在暫停

@Override 
protected void onPause() { 
    //this should be before super 
    mDataBase.removeEventListener(childListener); 
    super.onPause(); 


} 
+0

謝謝你的建議,但我也想聽ChildAdded,所以我可以提醒當用戶得到消息:) –

+0

所以你的問題是,當你回到監聽器再次觸發,或當你重新創建活動 –

+0

當我離開活動,然後返回到它:( –

相關問題