2016-07-13 12 views
1

Hallo Ich versuche ein Login-System für meine App zu bauen. Ich versuche sicherzustellen, dass ich eingeloggt bin, bevor ich zu meiner nächsten Aktivität übergehe, aber Firebase scheint aufzuhören, sich einzuloggen, wenn ich eine While-Schleife betrete. Wie ernst wtf? Ich baue das in Android Studio BTW. HierCreateUserWithEmailandPassword stoppt beim Eingeben der While-Schleife?

ist ein Code:

void handleLogin() { 
//Check our form 
    if (!validateForm()) { 
     Toast.makeText(getApplication(), "All Fields Required", 
      Toast.LENGTH_SHORT).show(); 
     return; 
    } 
    //Sign in the user 
    mAuth.createUserWithEmailAndPassword(email, password) 
      .addOnCompleteListener(this, new  OnCompleteListener<AuthResult> () { 
      @Override 
      public void onComplete(@NonNull Task<AuthResult> task) { 
       Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful()); 
       if (!task.isSuccessful()) { 
        Log.w(TAG, "signInWithEmail", task.getException()); 
        Toast.makeText(getApplication(), "Authentication failed.", 
          Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
} 

/************************************************* 
* ON CREATE - The Activity runs from here! 
*************************************************/ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mAuth = FirebaseAuth.getInstance(); 
    setContentView(R.layout.activity_create_profile); 

    //Checking authState from Firebase 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth mAuth) { 
      FirebaseUser user = mAuth.getCurrentUser(); 
      if (user != null) { 
       Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
       isLogged = true; 
       System.out.println("Logged in: " + isLogged); 
      } else { 
       Log.d(TAG, "onAuthStateChanged:signed_out"); 
     } 
    } 
}; 

//Pop up for when adminID is activated 
adminIDField = (EditText) findViewById(R.id.editText13); 
adminIDField.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) 
      showPopUp(); 
     else 
      System.out.println("Admin ID entered..."); 
    } 
}); 

// Create Profile Button 
createProfile = (Button) findViewById(R.id.button13); 
createProfile.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     Calendar currentTime = Calendar.getInstance(); 
     Calendar timeOut = (Calendar)currentTime.clone(); 
     timeOut.add(Calendar.SECOND, 10); 
     emailString = (EditText) findViewById(R.id.editText7); 
     passwordString = (EditText) findViewById(R.id.editText8); 
     firstNameField = (EditText) findViewById(R.id.editText10); 
     lastNameField = (EditText) findViewById(R.id.editText11); 
     apartmentField = (EditText) findViewById(R.id.editText12); 
     Intent intent = new Intent("android.intent.action.MENU"); 

     handleLogin(); 

     while(!isLogged){ //THIS IS WHERE MY PROBLEM OCCURS 
      System.out.println("Authenticating..."); 
      try{ 
       Thread.sleep(250); 
      }catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 
     //handleDataStorage(); 
     //startActivity(intent); 
    } 
}); 
} 

Aus irgendeinem Grund, wenn ich die while-Schleife nicht dort haben in es mir anmeldet ganz gut, aber wenn ich den Login sind while-Schleife es bleibt dort für immer. Warum das?

+0

ich weiß nicht, warum das nicht funktioniert (vielleicht der auth-Hörer wird nicht ausgelöst, wenn der Thread schläft), aber warum Benötigen Sie eine while-Schleife, wenn der Listener nur bei Änderungen des auth-Status ausgelöst wird? –

+0

@RohitNavarathna Ich brauche es, weil aus irgendeinem Grund (ich denke, es ist ein asynchrones Problem) meine App durch meine Funktionen bläst, ohne darauf zu warten, dass sie sich tatsächlich in Firebase einloggen und dann eine Menge User Creation Sachen vermasseln. Ich möchte also warten, bis sich der Auth-Status ändert (oder eine gewisse Zeit) und dann zu meiner nächsten Aktivität übergehen. – dylanjm

+0

Warum starten Sie die neue Aktivität nicht einfach in der Bedingung '(user! = Null)' des Auth-State-Listeners? –

Antwort

0

Verwenden Sie eine Spin-Schleife von Thread.sleep(), um auf etwas zu warten, ist eine sehr schlechte Idee. Android (und die meisten modernen Umgebungen) implementieren ereignisgesteuerte Modelle, die dies überflüssig machen.

Wenn Sie Ihren Code aus, es läuft darauf hinaus:

doThingA(); 
waitForThingA(); 
doSomethingThatDependsOnThingA(); 

In einem Modell Event Driven Sie würde dies stattdessen schreiben wie:

doThingAandThen(doSomethingThatDependsOnThingA); 

Wenn Sie den Code anschauen bereits Sie haben, können Sie Beispiele finden, wo dieses Muster bereits folgt. Zum Beispiel reagiert dieser Code auf, wenn der Authentifizierungsstatus des Benutzers ändert.

mAuthListener = new FirebaseAuth.AuthStateListener() { 
    @Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth mAuth) { 
     FirebaseUser user = mAuth.getCurrentUser(); 
     if (user != null) { 
      Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
      isLogged = true; 
      System.out.println("Logged in: " + isLogged); 
     } else { 
      Log.d(TAG, "onAuthStateChanged:signed_out"); 
    } 
} 

Sie mögen die Datenspeicherung und den Übergang zu einer anderen Aktivität zu handhaben, wenn der Benutzer angemeldet ist durch diesen Code in diese sogenannten setzen genannt auth Zustand Hörer, können Sie das gleiche ohne Warteschleife erreichen:

//Checking authState from Firebase 
mAuthListener = new FirebaseAuth.AuthStateListener() { 
    @Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth mAuth) { 
     FirebaseUser user = mAuth.getCurrentUser(); 
     if (user != null) { 
      Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
      isLogged = true; 
      handleDataStorage(); 
      //startActivity(intent); 
     } else { 
      Log.d(TAG, "onAuthStateChanged:signed_out"); 
    } 
} 
+0

Das funktioniert wie ein Zauber, es wurde zuvor oben in den Kommentaren erwähnt, aber das ist wirklich eine großartige Erklärung für das Problem, das ich hatte. Vielen Dank! – dylanjm

Verwandte Themen