Firebase AuthStateListener zomb ie обратный вызов - PullRequest
0 голосов
/ 23 апреля 2020

Я использую FirebaseUI для аутентификации. Это мой простой SignInActivity. Начинается MainActivity после успешного входа. Процесс входа работает нормально (Запросить вход> вход> show MainActivity). Но когда я выхожу из MainActivity, из ниоткуда он снова просит войти (показывает Auth UI, вызывая stateChange). Насколько я понимаю, если SignInActivity уже закончил, SignOut() не должен делать ничего, кроме выхода. Откуда этот зомб ie звонок?

Мои наблюдения: Работает нормально, когда я mFirebaseAuth.addAuthStateListener(this) и реализую интерфейс. Что плохого в обратном вызове в методе?

public class SignInActivity extends AppCompatActivity {
    private static final int RC_SIGN_IN = 1;
    private FirebaseAuth mFirebaseAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);
        mFirebaseAuth = FirebaseAuth.getInstance();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mFirebaseAuth.addAuthStateListener(this::stateChange);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mFirebaseAuth.removeAuthStateListener(this::stateChange);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(this, "signed in", Toast.LENGTH_SHORT).show();
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "signed in cancel", Toast.LENGTH_SHORT).show();
                finish();
            }
        }
    }

    public void stateChange(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // user has signed in, finish this and go to main screen
            startActivity(new Intent(SignInActivity.this, MainActivity.class));
            finish();
        } else {
            // user has not signed in, show sign in
            startActivityForResult(AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setIsSmartLockEnabled(false, true)
                    .setAvailableProviders(Arrays.asList(
                            new AuthUI.IdpConfig.GoogleBuilder().build(),
                            new AuthUI.IdpConfig.EmailBuilder().build()))
                    .build(), RC_SIGN_IN);
        }
    }
}

Код выхода MainActivity для menu:

AuthUI.getInstance().signOut(this); // just this single line, no finish() or anything
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...