2015-06-22 4 views
8

में श्रोता को हटा नहीं रहा है, जब मैं विशेष फ़ील्ड का मान सत्य होता हूं तो मैं firebase ref से addValueEventListener श्रोता को हटाना चाहता हूं।removeEventListener फायरबेस

ValueEventListener valueListener=null; 

private void removeListener(Firebase fb){ 
    if(valueListener!=null){ 
     **fb.removeEventListener(valueListener);** 
    } 
} 

String key="https://boiling-heat-3083.firebaseio.com/baseNodeAttempt/" + userId+"/"+nodeType+"/"+nodeId+"/data"; 
final Firebase fb = new Firebase(key); 
valueListener=fb.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snap) { 
     final HashMap<String, Object> data=(HashMap<String, Object>) snap.getValue(); 
     if(data.get("attemptFinish_"+nodeId)!=null){ 
      boolean title = (boolean) snap.child("attemptFinish_"+nodeId).getValue(); 
      if(title){ 
       removeListener(fb); 
      } 
     } 
    } 
    @Override 
    public void onCancelled() { 
     // TODO Auto-generated method stub 
    } 
}); 

लेकिन addValueEventListener हटाया जा रहा नहीं कर रहा है और यह कि firebase रेफरी के लिए कहा जाता है। तो कृपया मुझे सलाह दें कि यदि आवश्यक हो तो किसी भी फायरबेस रीफ से श्रोता को कैसे हटाया जाए।

+0

आपका 'valueListener' हमेशा होता है' null' – talex

+1

आप श्रोता कॉलबैक के भीतर से 'के साथ करता है, तो (शीर्षक) {fb.removeEventListener (यह) हटा सकते हैं; } '। असंबंधित: इस कोड के अधिकांश पाठक मान लेंगे कि 'शीर्षक' एक स्ट्रिंग है। आप एक वेरिएबल नाम का उपयोग करना चाह सकते हैं जो बूलियन के रूप में व्याख्या करने के लिए थोड़ा अधिक सहज है, उदा। 'IsFinished'। –

+1

वैल्यू लिस्टनर का संदर्भ है जब श्रोता जोड़ा जाता है @talex – Keshav

उत्तर

8

आप के साथ कॉलबैक के भीतर से श्रोता निकाल सकते हैं:

ref.removeEventListener(this); 

तो एक पूरा टुकड़ा:

String key="https://boiling-heat-3083.firebaseio.com/baseNodeAttempt/" + userId+"/"+nodeType+"/"+nodeId+"/data"; 
final Firebase ref = new Firebase(key); 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snap) { 
     if (snap.hasChild("attemptFinish_"+nodeId) { 
      boolean isFinished = (boolean) snap.child("attemptFinish_"+nodeId).getValue(); 
      if(isFinished){ 
       ref.removeEventListener(this); 
      } 
     } 
    } 
    @Override 
    public void onCancelled() { 
     // TODO Auto-generated method stub 
    } 
}); 

मैं HashMap हटा दिया, बजाय DataSnapshot के तरीकों का उपयोग कर एक ही पूरा करने के लिए । मैंने स्पष्ट/अधिक मूर्खतापूर्ण होने के लिए कुछ चर का नाम भी बदल दिया।

+2

मैंने कोशिश की है लेकिन श्रोता को उपरोक्त कोड @ फ्रैंक वैन पफेलन – Keshav

+0

का उपयोग करके हटाया नहीं जा रहा है क्या आपने डीबगर में भाग लिया था? यदि हां, तो क्या 'सत्य' कभी खत्म हो गया है? –

+1

हां इसके सत्य और लॉगर के अंदर अगर ref.removeEventListener (यह) के ऊपर कथन – Keshav

2

सुनिश्चित करें कि आप श्रोता को अपने डेटाबेस संदर्भ पर उसी नोड पर जोड़ दें और हटा दें। उदाहरण के लिए:

//when declared like this, mDatabaseReference will point to the parent node by default 
private DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

//listener added to child node "path_2" 
mDatabaseReference.child(path_1).child(path_2).addChildEventListener(myListener); 
} 

आपका श्रोता यह मामला पथ 2 पर इंगित कर रहा है। आप इस कोड

//mDatabaseReference pointing to parent node (default behaviour) 
mDatabaseReference.removeEventListener(myListener); 

यह काम नहीं करेगा क्योंकि आप गलत नोड से श्रोता को दूर करने के प्रयास कर रहे हैं का उपयोग कर अपने श्रोता को दूर करने का प्रयास करें। सही तरीका होगा

mDatabaseReference.child(path_1).child(path_2).removeEventListener(myListener); 
+0

निष्पादित हो जाता है तो मेरे लिए काम नहीं कर रहा है हालांकि लेकिन मुझे यह त्रुटि भी मिली –

0

मुझे आशा है कि यह आपकी मदद करेंगे ... बस यो इस विधि का उपयोग कर सकते हैं, यह मेरे लिए काम है ... OnCreate (से

private DatabaseReference dbRef; 

लिखें)

OnDestroy से
FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    dbRef= database.getReference("YOUR_PATH").child("KEY_NAME"); 
    InitListener(); 
    dbRef.addValueEventListener(valueEventListener); // ADDIND_LISTENER 

लिखें()

if (dbRef!=null){ 
     dbRef.removeEventListener(valueEventListener); 
     valueEventListener=null; 
     dbRef=null; 

    } 

सूची ener

private void InitListener(String templeId) { 
    valueEventListener=new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

}