2016-06-07 8 views
16

के बाद दो बार आग लगती है जब मैं signInWithEmailAndPassword() का उपयोग onAuthStateChanged() लॉगिन करने के लिए हमेशा दो बार आग लगाता हूं।फायरबेस एंड्रॉइड ऑनऑथस्टेट चेंज() साइनइनविथईमेल और पासवर्ड()

मुझे पूरा यकीन है कि सुनने के बाद श्रोताओं को हटाने के लिए केवल firebaseAuth, and I have the code in ऑनस्टॉप() `में जोड़ा जाता है।

कोई भी इसे हल करने के बारे में जानता है?

मेरे कोड:

public class SignInActivity extends BaseActivity implements 
     View.OnClickListener, 
     GoogleApiClient.OnConnectionFailedListener{ 

    private static final String PREF_KEY_USER_EMAIL = "User_Email"; 
    private static final int RC_SIGN_IN = 1111; 

    private FirebaseAuth firebaseAuth; 
    private FirebaseAuth.AuthStateListener authStateListener; 
    private DatabaseReference firebaseDbReference; 

    private TextView fieldEmail; 
    private TextView fieldPassword; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sign_in); 
     getSupportActionBar().hide(); 

     firebaseAuth = FirebaseAuth.getInstance(); 
     firebaseDbReference = FirebaseDatabase.getInstance().getReference(); 
     fieldEmail = (TextView) findViewById(R.id.field_email); 
     fieldPassword = (TextView) findViewById(R.id.field_password); 

     String userSavedEmail = getPreferences(MODE_PRIVATE).getString(PREF_KEY_USER_EMAIL, ""); 
     if(userSavedEmail != null) { 
      fieldEmail.setText(userSavedEmail); 
      fieldPassword.requestFocus(); 
     } 

     TextView linkForgotPassword; 
     Button buttonLogin; 

     linkForgotPassword = (TextView) findViewById(R.id.link_forgotPassword); 
     buttonLogin = (Button) findViewById(R.id.button_Login); 
     buttonSignUp = (Button) findViewById(R.id.button_signUp); 

     if (linkForgotPassword != null) { 
      linkForgotPassword.setOnClickListener(this); 
     } 
     if (buttonLogin != null) { 
      buttonLogin.setOnClickListener(this); 
     } 
     if (buttonSignUp != null) { 
      buttonSignUp.setOnClickListener(this); 
     } 

     authStateListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       if(firebaseAuth.getCurrentUser() != null) { 
        onAuthSuccess(firebaseAuth.getCurrentUser()); 
       } 
      } 
     }; 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     firebaseAuth.addAuthStateListener(authStateListener); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (authStateListener != null) { 
      firebaseAuth.removeAuthStateListener(authStateListener); 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case R.id.link_forgotPassword: 
       forgotPassword(); 
       break; 
      case R.id.button_Login: 
       emailLogin(); 
       break; 
      case R.id.button_signUp: 
       emailSignUp(); 
       break; 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
    } 

    private void forgotPassword(){ 
     FirebaseAuth auth = FirebaseAuth.getInstance(); 
     String emailAddress = fieldEmail.getText().toString(); 

     if(TextUtils.isEmpty(emailAddress)){ 
      Toast.makeText(SignInActivity.this, R.string.msg_EnterEmail, 
        Toast.LENGTH_SHORT).show(); 
     } 
     else { 
      showProgressDialog(); 
      auth.sendPasswordResetEmail(emailAddress) 
        .addOnCompleteListener(new OnCompleteListener<Void>() { 
         @Override 
         public void onComplete(@NonNull Task<Void> task) { 
          hideProgressDialog(); 
          if (task.isSuccessful()) { 
           Toast.makeText(SignInActivity.this, R.string.msg_ResetPasswordEmailSent, 
             Toast.LENGTH_LONG).show(); 
          } 
         } 
        }); 
     } 
    } 

    private void emailLogin(){ 
     if (!validateForm()) { 
      return; 
     } 

     showProgressDialog(); 
     String email = fieldEmail.getText().toString(); 
     String password = fieldPassword.getText().toString(); 

     firebaseAuth.signInWithEmailAndPassword(email, password) 
       .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         hideProgressDialog(); 

         if (!task.isSuccessful()) { 
          Toast.makeText(SignInActivity.this, R.string.msg_EmailLoginFailed, 
            Toast.LENGTH_SHORT).show(); 
         } 
         else { 
          // Save the email 
          getPreferences(MODE_PRIVATE).edit() 
            .putString(PREF_KEY_USER_EMAIL, fieldEmail.getText().toString()) 
            .apply(); 
         } 
        } 
       }); 
    } 

    private void emailSignUp(){ 
     if (!validateForm()) { 
      return; 
     } 

     showProgressDialog(); 
     String email = fieldEmail.getText().toString(); 
     String password = fieldPassword.getText().toString(); 

     firebaseAuth.createUserWithEmailAndPassword(email, password) 
       .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         hideProgressDialog(); 

         if (task.isSuccessful()) { 
          FirebaseUser user = task.getResult().getUser(); 
          String displayName = displayNameFromEmail(user.getEmail()); 

          // Update profile display name. 
          UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() 
            .setDisplayName("Jane Q. User") 
            .build(); 
          user.updateProfile(profileUpdates); 
         } else { 
          Toast.makeText(SignInActivity.this, R.string.msg_EmailSignUpFailed, 
            Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 
    } 

    private void onAuthSuccess(FirebaseUser user) { 
     // Write new user 
     writeNewUser(user.getUid(), 
       user.getDisplayName(), 
       user.getEmail(), 
       user.getPhotoUrl()); 

     // Go to MainActivity 
     startActivity(new Intent(this.getApplicationContext(), MainActivity.class)); 
     finish(); 
    } 

    private void writeNewUser(String userId, String displayName, String email, android.net.Uri photoUrl) { 
     User user = new User(displayName, email); 

     if(photoUrl != null){ 
      user.setPhotoUrl(photoUrl.toString()); 
     } 

     firebaseDbReference.child("users").child(userId).setValue(user); 
    } 

    private String displayNameFromEmail(String email) { 
     if (email.contains("@")) { 
      return email.split("@")[0]; 
     } else { 
      return email; 
     } 
    } 

    private boolean validateForm() { 
     boolean result = true; 
     if (TextUtils.isEmpty(fieldEmail.getText().toString())) { 
      fieldEmail.setError("Required"); 
      result = false; 
     } else { 
      fieldEmail.setError(null); 
     } 

     if (TextUtils.isEmpty(fieldPassword.getText().toString())) { 
      fieldPassword.setError("Required"); 
      result = false; 
     } else { 
      fieldPassword.setError(null); 
     } 

     return result; 
    } 
} 
+1

क्रॉस-पोस्ट: https://groups.google.com/forum/#!topic/firebase-talk/IyonCBrR0kg –

उत्तर

6

यह आग दो बार करता है और मुझे लगता है कि यह एक बग है कि Firebase लोग ठीक करना चाहिए है (आप फ्रैंक को देख hehehe)। एकमात्र चीज जो मैं सोच सकता हूं कि आप अभी ऐसा कर सकते हैं, इस तरह एक ध्वज जोड़ना है।

private boolean flag = true; 
... 
authStateListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       if(firebaseAuth.getCurrentUser() != null && flag) { 
        onAuthSuccess(firebaseAuth.getCurrentUser()); 
        flag=false; 
       } 
      } 
     }; 

आदर्श से दूर, लेकिन अब के लिए काम करेगा। कोड अभी भी दो बार आग लगता है, हम पहले व्यक्ति को स्वीकार करते हैं और दूसरे ध्वज को हमारे ध्वज से इनकार करते हैं, इस तरह यदि फ़ायरबेस लोग इसे ठीक करते हैं और अचानक श्रोता एक बार चलता है, तो हमारा कोड अभी भी काम करता है। शायद यह श्रोताओं के लिए दो बार दौड़ने का इरादा है, उम्मीद है कि हमारे पास फ्रैंक के क्रॉस-पोस्ट

+0

यह वास्तव में पूरी तरह से काम नहीं करेगा, अगर कोई उपयोगकर्ता लॉगिन नहीं कर रहा है तो आप वर्तमान उपयोगकर्ता के बाद से अधिसूचित नहीं हो रहे हैं शून्य, साथ ही उपयोगकर्ता बदलता है। मेरा उत्तर देखें – Marcel

+2

यह एक कामकाज है, यह अब तक अभी भी होता है। मेरे मामले में भी 3 बार आग लगती है! –

+2

हर बार जब मैं लॉगआउट करता हूं तो फिर से लॉगिन करता हूं, जब तक कि मैं अपना ऐप पुनरारंभ नहीं करता तब तक यह एक और बार आग लग जाता है। – nilsi

0

आदर्श से बहुत कुछ भी जवाब मिलेगा, लेकिन यह अधिक सटीक समाधान है।

private String authFlag = ""; 

... 

authStateListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {  
      if (firebaseAuth.getCurrentUser() == null) { 
       if (authFlag != null) { 
       authFlag = null; 
       subscriber.onNext(null); 
       } 
      } else { 
       String uid = firebaseAuth.getCurrentUser().getUid(); 
       if (authFlag == null || authFlag.isEmpty() || !authFlag.equals(uid)) { 
       authFlag = uid; 
       subscriber.onNext(firebaseAuth.getCurrentUser()); 
       } 
      } 
} 
+0

मुझे पता है कि आदर्श समाधान नहीं है, बल्कि अपनी टिप्पणियां पोस्ट करें – Marcel

2

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

Documentation का कहना है:

onAuthStateChanged (FirebaseAuth प्रमाणन)

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

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

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

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

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

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

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

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

+0

हां, मैं सहमत हूं, और मेरी खोज में मैंने देखा कि यह पंजीकरण कॉल के कारण है, हालांकि पंजीकरण और लॉगिन के बीच अंतर कैसे करें। –

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