2016-07-13 2 views
1

Здравствуйте, я пытаюсь создать систему входа для своего приложения. Я пытаюсь убедиться, что я вошел в систему, прежде чем перейти к следующему действию, но firebase, похоже, перестает пытаться войти в систему, если я вхожу в цикл while. Как серьезно wtf? Я создаю это в студии Android.CreateUserWithEmailandPassword останавливается при входе в цикл?

Вот код:

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); 
    } 
}); 
} 

По какой-то причине, когда я не имею петлю в то время как там он регистрирует меня просто отлично, но когда я включаю вход в то время как цикл он остается там навсегда. Почему это?

+0

Я не знаю, почему это не работает (возможно Auth слушатель не срабатывает, когда поток спит), но почему вам нужен цикл while, если слушатель срабатывает только при изменении состояния auth? –

+0

@RohitNavarathna Мне это нужно, потому что по какой-то причине (я думаю, что это асинхронная проблема) мое приложение прорвется через мои функции, не дожидаясь, когда он действительно войдет в firebase, а затем испортит кучу вещей для создания пользователей. Поэтому я хочу дождаться изменения состояния auth (или определенного количества времени), а затем перейти к следующему действию. – dylanjm

+0

Почему бы просто не начать новую активность в состоянии '(user! = Null)' состояния прослушивателя состояния auth? –

ответ

0

Использование спиновой петли Thread.sleep(), чтобы подождать, чтобы что-то произошло, - очень плохая идея. Android (и большинство современных сред) реализуют модели, управляемые событиями, которые устраняют необходимость этого.

Если вы посмотрите на ваш код, это сводится к:

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

В приводимой модели событий вы бы вместо того, чтобы написать это как:

doThingAandThen(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- называется Auth состояние слушателя, вы можете сделать то же самое без цикла ожидания:

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

Смежные вопросы