如何阻止某个方法被两次调用?

时间:2019-08-09 06:35:31

标签: android firebase firebase-authentication android-livedata

我正在尝试通过Google实施Firebase身份验证。在登录按钮上,单击AuthCredential时,我会得到onActivityResult()的详细信息:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            GoogleSignInAccount account = task.getResult(ApiException.class);
            if (account != null) {
                String tokenId = account.getIdToken();
                AuthCredential credential = GoogleAuthProvider.getCredential(tokenId, null);
                initViewModel(credential);
            }
        } catch (ApiException e) {}
    }
}

这就是我初始化ViewModel的方式:

private void initViewModel(AuthCredential credential) {
    viewModel = ViewModelProviders.of(this, factory).get(SignInViewModel.class);
    viewModel.signInWithGoogle(credential).observe(this, task -> {
        if (task.isSuccessful()) {
            FirebaseUser user = auth.getCurrentUser();
            if (user != null) {
                createUser(user);
            } else {
                Log.d(TAG, "user = null");
            }
        }
    });
}

创建用户后,我将被重定向到第二个活动。到现在为止,一切正常。问题是在第二个活动中退出时出现的,我被重定向到SignInActivity,由于某种原因initSignInViewModel被两次调用,一次是无故打印user = null而第二次当我按下登录按钮时。

如何阻止这种情况的发生?我只想在按下按钮时被触发。谢谢。

编辑:

在我退出的活动中,我使用以下代码。首先,我实现FirebaseAuth.AuthStateListener接口并重写此方法:

@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    if (firebaseUser == null) {
        Intent intent = new Intent(MainActivity.this, SignInActivity.class);
        startActivity(intent);
    }
}

这是退出代码,当我按下按钮时会被调用:

        FirebaseAuth.getInstance().signOut();
        if (googleApiClient.isConnected()) {
            Auth.GoogleSignInApi.signOut(googleApiClient);
        }

1 个答案:

答案 0 :(得分:0)

尝试在“活动处理”注销中执行此操作:

//Declaration and defination
private FirebaseAuth firebaseAuth;
FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        if (firebaseAuth.getCurrentUser() == null){
            //Do anything here which needs to be done after signout is complete
            signOutComplete();
        }
        else {
        }
    }
};

//Init and attach
firebaseAuth = FirebaseAuth.getInstance();
firebaseAuth.addAuthStateListener(authStateListener);

//Call signOut()
firebaseAuth.signOut();
相关问题