2017-11-03 34 views
-5

아래와 같이 내 onPause 메서드에서 활동을 떠날 때 내 ChildEventListener observer를 제거하려고합니다. 기본적으로 내 문제는 내가 활동을 떠나서 돌아올 때 내 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가 트리거되면 배열 목록에서 요소를 제거하고 여러 번 호출 되었기 때문에 제거하려고하는 인덱스가 없기 때문에 배열 목록에서 두 개 이상의 항목을 제거합니다. –

+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)을 의미합니다. 이것이 당신이 한 일이면 이것은 문제입니다. 왜냐하면 당신이 다시 돌아올 때 활동이 다시 시작될 때 등등 ...하지만 (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) 

편집 2

좋아 내가 가지고 슈퍼가 일시 정지

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


} 
+0

제안 해 주셔서 감사합니다.하지만 사용자가 메시지를받을 때 경고 할 수 있도록 ChildAdded도 듣고 싶습니다. –

+0

so 귀하의 문제는 청취자가 다시 돌아올 때 또는 활동을 다시 만들 때입니다. –

+0

활동을 종료 한 후 다시 돌아올 때 : ( –