2015-11-18 6 views
11

मेरे पास किसी स्थान पर दिए गए उपयोगकर्ता के लिए चैट रूम की एक सूची है, और किसी अन्य स्थान पर दिए गए चैट रूम के लिए संदेशों की कुल संख्या है। मैं चैट रूम उपयोगकर्ता से संबंधित कई संदेशों का ट्रैक रखना चाहता हूं।एंड्रॉइड पर फायरबेस में श्रोताओं का ट्रैक कैसे रखें?

मैं एक निम्नलिखित स्निपेट:

//getting all chat rooms this user belongs to 
mFirebase.child("myChatRooms").child("testUser").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded (DataSnapshot dataSnapshot, String previousKey){ 
     for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
      ChatRoom myRoom = postSnapshot.getValue(ChatRoom.class); 

      //listening to message count in every chat room user belongs to 
      mFirebase.child("chatRoomMessageCount").child(postSnapshot.getKey()).addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
         //number of messages have changed 
       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 

       } 
      }); 
     } 
    } 

    //...... 
} 

सवाल है, मैं कैसे को दूर उन सभी ValueEventListener के बाद, जब onChildRemoved बुलाया जाएगा, या मैं उन्हें अब और ज़रूरत नहीं होगी करते हैं?

इस स्थिति से निपटने में अनुशंसित दृष्टिकोण क्या है? क्या मुझे हैश मैप में बाल कुंजी और श्रोता स्टोर करना चाहिए और उन्हें स्वयं का ट्रैक रखना चाहिए या किसी दिए गए फायरबेस स्थान के लिए सभी श्रोताओं को हटाने का कोई तरीका है?

उत्तर

18

एक डेटा ईमानदार तरीका onStop में ValueEventListeners की और फिर एक HashMap बनाने के लिए किया जाएगा या onDestroy आप उन श्रोताओं को दूर करेंगे।

चीजों को सरल रखने के लिए, आपको कमरे प्राप्त करने के लिए एक ईवेंट श्रोता का उपयोग करना चाहिए। फिर प्रत्येक कमरे के लिए आप एक रीयलटाइम श्रोता बना सकते हैं।

public class MainActivity extends Activity { 

    private Firebase mRef; 
    private HashMap<Firebase, ValueEventListener> mListenerMap; 

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

     mRef = new Firebase("https://<your-firebase-app>/myChatRooms/testUser"); 

     mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 

        ValueEventListener listener = new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          // do your thing here 
         } 

         @Override 
         public void onCancelled(FirebaseError firebaseError) { 

         } 
        }; 
        mListenerMap.put(postSnapshot.getRef(), listener); 
        Firebase childRef = mRef.child("chatRoomMessageCount").child(postSnapshot.getKey()); 
        childRef.addValueEventListener(listener); 
       } 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     for (Map.Entry<Firebase, ValueEventListener> entry : mListenerMap.entrySet()) { 
      Firebase ref = entry.getKey(); 
      ValueEventListener listener = entry.getValue(); 
      ref.removeEventListener(listener); 
     } 
    } 
} 
+1

यह मूल रूप से मेरे मन में था। मैं वास्तव में उम्मीद कर रहा था कि ऐसा करने का एक और शानदार तरीका होगा, या इसी तरह की कार्यक्षमता पहले से ही बनाई गई है। उदाहरण के लिए हम addValueEventListener के लिए TAG को दूसरे पैरामीटर के रूप में पास कर सकते हैं, और उसके बाद निकालें ValueEventListenersWithTag जैसे कुछ कॉल करें। लेकिन, मुझे लगता है कि वास्तविक समय और फायरबेस की निरंतर प्रकृति को देखते हुए आपने लोगों को डेवलपर्स को छोड़ने का फैसला किया, जो ठीक है, लेकिन आपको इसे दस्तावेज़ों में प्रतिबिंबित करना होगा। फ्लैट डेटा अक्सर नेस्टेड श्रोताओं की ओर जाता है, और यह अवधारणा के लिए नए लोगों के लिए भ्रमित हो सकता है। – Sver

+3

मैं सहमत हूं। मैं एक और अधिक सुरुचिपूर्ण समाधान में और अधिक शोध करूँगा। मेरे लिए आपका फ़ीडबैक वाकई सराहनीय है! –

+0

क्या यह आपके लिए स्वीकृत उत्तर की आवश्यकताओं को पूरा करता है? या क्या कोई अन्य विचार हैं? –

संबंधित मुद्दे