【问题标题】:How to stop a method from being called twice?如何阻止方法被调用两次?
【发布时间】:2019-08-09 06:35:31
【问题描述】:

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

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

【问题讨论】:

  • 分享整个活动java代码
  • 退出后重定向到SignInActivity的代码在哪里?
  • @ZohaibAmir 请查看我编辑的问题。
  • @Omi 请查看我编辑的问题。
  • 另外,注销后,您是如何离开的?确保在 authState 侦听器中导航。如果用户为空,则不需要 auth.signOut()

标签: android firebase firebase-authentication android-livedata


【解决方案1】:

尝试在 Activity 处理注销中执行此操作:

//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();

【讨论】:

  • 感谢您的回答。这正是我在第二个活动中所做的事情。
  • 那么请分享您要退出的代码。
  • 不要直接使用覆盖方法,而是尝试我的解决方案,并且在检查用户为空后不要调用 auth.signOut
  • 即使我实现了一个接口或者我使用了你的代码,我也会得到相同的行为:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2021-11-04
  • 2013-12-31
  • 1970-01-01
  • 2020-07-16
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多