Firebase Auth无法使用Android

时间:2016-07-04 23:04:25

标签: android firebase firebase-authentication

我是Android和firebase的新手,当我尝试从Firebase注销时遇到了一些问题。

我的一段代码在底部跟随..

在onAuthStateChanged侦听器中,我尝试创建一个Firebase用户并获取当前用户以检查它是否为null(根据Firebase文档表示用户已登录)或null表示用户不是登录..

然后出现问题..

出于测试/好奇目的,如果用户已登录,我会尝试更新用户个人资料并设置自定义显示名称..以查看会发生什么。

在更新配置文件后,更具体地说,更新了该行 " user.updateProfile(profileUpdates);"打破了signout()函数。

如果我注释掉" user.updateProfile(profileUpdates);" signout()函数似乎工作正常!

你能指出我做错了什么吗?

firebase用户是否有重复的实例?

提前致谢!

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private FirebaseAuth FireAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mFireDatabase;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    FireAuth = FirebaseAuth.getInstance();

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {
                // already signed in
                UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                        .setDisplayName("SuperMan").build();
                user.updateProfile(profileUpdates); // This breaks it!
                signoutButton.setText(user.getDisplayName().toString());

            } else {
                // not signed in

            }

        }
    };

}

public void signin(String email, String password){

   FireAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            Log.d("myTEST","signInWithEmailAndPassword:complete:"+task.isSuccessful());
        }
    });
}
private void signout(){
    //FireAuth.getInstance().signOut();
    FireAuth.signOut();

}

public void getDisplayName(){

    if (FireAuth.getCurrentUser() !=null){
        UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                .setDisplayName("SuperMan").build();

        FireAuth.getCurrentUser().updateProfile(profileUpdates);
        signoutButton.setText(FireAuth.getCurrentUser().getUid().toString());
        if(FireAuth.getCurrentUser().isAnonymous()){
            signoutButton.setText("Anonymous");
        }

    }else{
        signoutButton.setText("empty..");
    }
}


@Override
public void onStart() {
    super.onStart();
    FireAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop(){
    super.onStop();
    FireAuth.removeAuthStateListener(mAuthListener);
}


@Override
public void onClick(View v){
    switch (v.getId()){
        case R.id.signinButton:
            signin(loginEditText.getText().toString(),passwordEditText.getText().toString());
        break;
        case R.id.signoutButton:
            signout();
        break;
        case R.id.button3:
            getDisplayName();
            break;

    }

}}

1 个答案:

答案 0 :(得分:0)

可能会解释您所看到的行为的一些观察结果。

首先,FirebaseUser.updateProfile()可能需要往返Firebase服务器并异步完成。您可以添加带有Log消息的完成侦听器,以便了解此信息:

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("SuperMan").build();
user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        Log.d(TAG, "onComplete: " + user.getDisplayName());
    }
});
Log.d(TAG, "Profile change requested");

其次,更改用户个人资料似乎会导致AuthStateListener触发,这会导致代码循环播放。添加一些Log语句将确认这种情况正在发生。我怀疑循环正在干扰注销处理。