2016-06-07 9 views
24

मैंने नए फायरबेस एसडीके के साथ काम करना शुरू कर दिया है।फायरबेस एंड्रॉइड ऑनऑथस्टेट चेंजड दो बार

जब मैं उपयोगकर्ता लॉगिन कर रहा हूं, तो मैं एथस्टेट चेंज विधि को उसी राज्य (आदि उपयोगकर्ता साइन इन) के साथ दो बार बुलाया जा रहा है।

मुझे यकीन है कि मैं केवल एक बार FirebaseAuth संदर्भ में AuthStateListener जोड़ रहा हूं।

कोई मदद?

+0

आपका कोड कहां है? –

+0

यह समस्या मेरे कोड में भी मौजूद है। 'ऑनस्टार्ट()' में केवल सुपर को कॉल करने के अलावा ही यह कोड है: 'FirebaseAuth.getInstance()। AddAuthStateListener (यह); '। यह कॉल कहीं और नहीं मिला है और मैंने जांच की है कि 'ऑनस्टार्ट()' केवल एक बार कहा जा रहा है। फिर भी, 'onAuthStateChanged (...)' विधि को दो बार (या कभी-कभी तीन बार) कहा जाता है। –

+1

शायद एक बग, इस जवाब में इस तरह के ध्वज का उपयोग करें: http://stackoverflow.com/a/37686371/3597165 – user3597165

उत्तर

29

हां, और यह बहुत परेशान है। यह एक पंजीकरण कॉल के कारण है। इतना ही नहीं, एथस्टेट चेंज पर कई अलग-अलग राज्यों में कई बार बुलाया जा रहा है, यह जानने की कोई संभावना नहीं है कि यह कौन सा राज्य है।

Documentation का कहना है:

onAuthStateChanged (FirebaseAuth प्रमाणन)

इस विधि प्रमाणीकरण राज्य में बदलाव पर यूआई धागा में लागू किया जाता है:

  • ठीक बाद श्रोता है पंजीकृत किया गया

  • जब वर्तमान उपयोगकर्ता

  • साइन आउट रहता है जब कोई उपयोगकर्ता

  • प्रवेश किया गया है वर्तमान उपयोगकर्ता
  • बदलता है जब वर्तमान उपयोगकर्ता के टोकन

यहाँ कुछ में कोई परिवर्तन होता है वर्तमान स्थिति की खोज करने के लिए युक्तियाँ:

  • पंजीकरण कॉल: ध्वज के साथ पहली कॉल छोड़ें।
  • उपयोगकर्ता साइन इन किया गया: पैरामीटर से उपयोगकर्ता है! = शून्य।
  • उपयोगकर्ता ने साइन आउट किया: पैरामीटर से उपयोगकर्ता == शून्य है।
  • वर्तमान उपयोगकर्ता परिवर्तन: पैरामीटर से उपयोगकर्ता है! = शून्य और अंतिम उपयोगकर्ता आईडी है! = पैरामीटर
  • उपयोगकर्ता टोकन रीफ्रेश करें: पैरामीटर से उपयोगकर्ता है! = शून्य और अंतिम उपयोगकर्ता आईडी == उपयोगकर्ता आईडी पैरामीटर से है

यह श्रोता एक गड़बड़ और बहुत बगप्रोन है। फायरबेस टीम को इसमें देखना चाहिए।

2

मेरा कामकाज ग्लूबल रूप से ध्वजांकित करने के लिए वैश्विक रूप से घोषित एक बूलियन का उपयोग करना है अगर एथस्टेट चेंज को पहले बुलाया गया है।

private Boolean authFlag = false; 
mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) { 
      if (firebaseAuth.getCurrentUser() != null) { 
       if(authFlag== false) { 
        // Task to perform once 
        authFlag=true; 
       } 
      } 
     } 
    }; 
+0

धन्यवाद सरल लेकिन जब आप अधिक समय बर्बाद नहीं करना चाहते हैं तो काम पूरा हो जाता है। –

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