2016-07-13 16 views
1

こんにちは、私は私のアプリのログインシステムを構築しようとしています。私は私が私の次のアクティビティに移動するが、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()のスピンループを使用して

+0

なぜこれが機能しないのか分かりません(スレッドがスリープ状態のときに認証リスナーが起動しないことがあります)が、なぜですかリスナーがauth状態が変化したときにだけ起動する場合はwhileループが必要ですか?何らかの理由で(私はそれが非同期の問題だと思う)のために私のアプリは、それが実際にfirebaseにログインして、めちゃくちゃにユーザー作成のものの束をするのを待たずに私の関数を使って爆破するため –

+0

@RohitNavarathnaは、私はそれを必要とします。ですから、私は認証状態が変わるまで待ってから、次の活動に移りたいと思っています。 – dylanjm

+0

理由だけではなく、認証状態リスナーの '(ユーザー!= null)の'状態で、新たな活動を開始していませんか? –

答えて

0

は非常に悪い考えです。 Android(およびほとんどの現代の環境)では、これを行う必要性を排除するイベント駆動モデルが実装されています。

あなたのコードを見れば、それはつまるところ:あなたはすでにコードであなたを見ると

doThingAandThen(doSomethingThatDependsOnThingA); 

:あなたの代わりにこれを書くとイベントドリブンモデルで

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

このパターンが既に続いている例を見つけることができます。たとえば、このコードは、ユーザの認証状態が変化したときに応答します。

あなたはユーザーが署名されたときに別の活動へのデータ保存や移行を扱いたい
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"); 
    } 
} 

このSO-にそのコードを置くことによって

//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

が表示されていない、それがコメントで上記まで前述したが、これは私が持っていた問題の説明は本当に素晴らしいですました。ありがとう! – dylanjm

関連する問題