こんにちは、私は私のアプリのログインシステムを構築しようとしています。私は私が私の次のアクティビティに移動するが、firebaseは、私はwhileループを入力すると、ログインしようとして停止しているようだ前に記録されていますことを確認しようとしています。真剣に何かと?私はアンドロイドスタジオbtwでこれを構築しています。ここでCreateUserWithEmailandPasswordはwhileループに入ると停止しますか?
はいくつかのコードです:
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);
}
});
}
何らかの理由で、私はそこにwhileループを持っていないとき、それはちょうど罰金に私を記録しますが、ループは、それは永遠にそこにとどまる一方で、私はログインが含まれている場合。何故ですか?起こるために何かを待つThread.sleep()
のスピンループを使用して
なぜこれが機能しないのか分かりません(スレッドがスリープ状態のときに認証リスナーが起動しないことがあります)が、なぜですかリスナーがauth状態が変化したときにだけ起動する場合はwhileループが必要ですか?何らかの理由で(私はそれが非同期の問題だと思う)のために私のアプリは、それが実際にfirebaseにログインして、めちゃくちゃにユーザー作成のものの束をするのを待たずに私の関数を使って爆破するため –
@RohitNavarathnaは、私はそれを必要とします。ですから、私は認証状態が変わるまで待ってから、次の活動に移りたいと思っています。 – dylanjm
理由だけではなく、認証状態リスナーの '(ユーザー!= null)の'状態で、新たな活動を開始していませんか? –