2015-06-05 4 views
8

मैं अपने एंड्रॉइड एप्लाइज़न के लिए फायरबेस-बैकएंड का उपयोग कर रहा हूं। मैं अपनी चैट के लिए एक उपयोगकर्ता उपस्थिति प्रणाली बनाना चाहता हूं। इस प्रयोजन के लिए मैं Firebase गाइडफायरबेस: जब घटना को डिस्कनेक्ट करें?

final Firebase myConnectionsRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/connections"); 

// stores the timestamp of my last disconnect (the last time I was seen online) 
final Firebase lastOnlineRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/lastOnline"); 

final Firebase connectedRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/connected"); 
connectedRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    boolean connected = snapshot.getValue(Boolean.class); 
    if (connected) { 
     // add this device to my connections list 
     // this value could contain info about the device or a timestamp too 
     Firebase con = myConnectionsRef.push(); 
     con.setValue(Boolean.TRUE); 

     // when this device disconnects, remove it 
     con.onDisconnect().removeValue(); 

     // when I disconnect, update the last time I was seen online 
     lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP); 
    } 
    } 

    @Override 
    public void onCancelled(FirebaseError error) { 
    System.err.println("Listener was cancelled at .info/connected"); 
    } 
}); 

मुसीबत से पैटर्न लिया है मैं नहीं जानता है जब onDisconnect गतिविधि सक्रिय की हैं ?!

हर बार जब मैं ऐप खोलता हूं तो मैं नोड को सत्य लिखता हूं "उपयोगकर्ता/जो/कनेक्शन" लेकिन जब मैंने ऐप बंद किया तो कुछ भी खुश नहीं होगा। जब मैंने वाईफ़ाई बंद कर दिया तो बूलियन पैरामीटर भी हटाया नहीं जाएगा। ऑन डिस्कनेक्ट-इवेंट केवल तभी निकाल दिया गया जब मैंने अपने ऐप को मजबूती से रोक दिया या इस ऐप को फिर से इंस्टॉल किया या कुछ और जब मैं निर्धारित नहीं कर सका।

तो, के रूप में मैं सही समझ में मैं मैन्युअल रूप से इस तरह की घटनाओं को संभालने के लिए है:

1) मेरी ऐप को बंद;

2) वाईफाई बंद करें;

3) हो सकता है किसी और

कुछ मेरे एप्लिकेशन में उपस्थिति सुविधा बनाने के लिए? लेकिन फिर पर डिस्कनेक्ट-इवेंट को निकाल दिया जाएगा?

  1. ग्राहक स्पष्ट रूप से सर्वर से डिस्कनेक्ट
  2. ग्राहक बस गायब हो जाता है

आप अनुप्रयोग को मारने जब:

उत्तर

13

कि हो सकता है जब क्लाइंट और सर्वर डिस्कनेक्ट हो जाते हैं दो मामलों रहे हैं , आप एक स्पष्ट डिस्कनेक्ट ट्रिगर कर रहे हैं। उस स्थिति में ग्राहक सर्वर को एक सिग्नल भेज देगा कि यह डिस्कनेक्ट हो रहा है और सर्वर तुरंत onDisconnect कॉलबैक निष्पादित करेगा।

जब आप वाईफाई बंद करते हैं, तो आपके ऐप को सर्वर को यह बताने का मौका नहीं मिलता है कि यह डिस्कनेक्ट हो रहा है। उस स्थिति में जब ग्राहक पता लगाता है कि ग्राहक चला गया है तो onDisconnect आग लग जाएगी। सॉकेट के लिए टाइम-आउट कॉन्फ़िगर किए जाने के तरीके के आधार पर इसमें कुछ मिनट लग सकते हैं। तो उस मामले में आपको थोड़ा और धीरज रखना होगा।

+0

मुझे यह नहीं मिला। जब कोई उपयोगकर्ता बैक बटन दबाता है और सभी गतिविधियों को बंद करता है, तो ऑनडिस्कनेक्ट() आग नहीं होता है। लेकिन इस स्थिति में, उपयोगकर्ता को ऑफ़लाइन विचार करना चाहिए, है ना? – iForests

+1

@IForests मुझे लगता है कि 'जब कोई उपयोगकर्ता बैक बटन दबाता है और सभी गतिविधियों को बंद करता है' को _ActivityLifecycleCallbacks_ – rookieDeveloper

+0

@Frank_van_Puffelen में संभाला जाना चाहिए, यह पता लगाने के लिए सर्वर के अधिकतम में कितना समय लग सकता है कि ग्राहक चला गया है? और यह सर्वर के लिए मिनटों का समय लेने में व्यावहारिक नहीं है क्योंकि ऑफ़लाइन जाने से तुरंत फ़ायरबेस सर्वर में संबंधित फ़ंक्शंस को ट्रिगर करना चाहिए ताकि उपयोगकर्ता एक-दूसरे की स्थिति को समझ सकें। –

0

उपयोगकर्ता एप्लिकेशन बाहर निकलने होता है तो आपको admin.database().goOffline() फोन स्पष्ट रूप से firebase, जो onDisconnect कॉलबैक उत्प्रेरित करने चाहिए से डिस्कनेक्ट करने सकता है। जब उपयोगकर्ता ऐप पर वापस आ रहा है तो फायरबेस से पुनः कनेक्ट करने के लिए बस admin.database().goOnline() पर कॉल करें।

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