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?
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? –
@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
Warum starten Sie die neue Aktivität nicht einfach in der Bedingung '(user! = Null)' des Auth-State-Listeners? –