2017-11-03 12 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....... 

}); 

そして、これは一度だけ(あなたの活動を作成するときに)起動します、そしてあなたは、リスナーの削除を心配する必要はありません。

EDIT

大丈夫、あなたが戻ってあなたの活動に戻ったとき、これはあなたが(onResume)または(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

soあなたの問題は、リスナーに戻ったとき、またはアクティビティを再作成するときです –

+0

アクティビティを終了してからリターンするとき:( –

関連する問題