繁体   English   中英

当我切换到活动或首先调用 onDataChanged 时,onCreate() 未运行

[英]onCreate() is not running when i switch to the activity or onDataChanged is getting called first

我正在做一个学校项目,我正在使用 firebase 身份验证和 email 和密码。 我在用户唱歌时遇到问题,然后返回到唱歌页面并尝试创建一个新帐户。 当单击提交按钮以创建他的新帐户而不是返回登录页面时,它会转到用户主页。 只有当用户已经登录然后尝试注册另一个帐户时才会发生这种情况。 当他返回登录页面时,我尝试将用户注销,但它没有用。 这是我的代码:

登录页面:

public class SignIn extends AppCompatActivity {

EditText email,pass;
private FirebaseAuth mAuth;
FirebaseUser user;
FirebaseDatabase db;
DatabaseReference mRef;
String type,name;

public ProgressDialog pd;

Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_in);
    mAuth = FirebaseAuth.getInstance();
    email = findViewById(R.id.inpSigninEmail);
    pass = findViewById(R.id.inpSigninPass);
    db.getInstance();
    mRef = FirebaseDatabase.getInstance().getReference().child("Users/");
    type=null;
    name=null;
    context=this;
    Log.e("asd","Loginoncreate");
}

public void signIn (View view){
    if (email.getText().toString().trim().length() < 1 || pass.getText().toString().trim().length() < 1){
        Toast.makeText(getApplicationContext(), "Please fill your information.", Toast.LENGTH_LONG).show();
    }else{
        pd = new ProgressDialog(this);
        pd.setMessage("Signing in...");
        pd.show();
        mAuth.signInWithEmailAndPassword(email.getText().toString(), pass.getText().toString()).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()){
                    user = mAuth.getCurrentUser();
                    mRef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            while (type==null){
                                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                                    type = String.valueOf(dataSnapshot.child(user.getUid()).child("/Type").getValue());
                                    if (type!="null"){
                                        break;
                                    }
                                }
                            }
                            while (name==null){
                                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                                    name = String.valueOf(dataSnapshot.child(user.getUid()).child("/Name").getValue());
                                    if (name!="null"){
                                        break;
                                    }
                                }
                            }
                            pd.dismiss();
                            if (type.matches("user")){
                                Intent intent = new Intent(context, UserMain.class);
                                intent.putExtra("name", name);
                                type=null;
                                name=null;
                                startActivity(intent);
                                finish();
                                Log.e("as","loginUser");
                            }else{
                                Intent intent = new Intent(context, CompanyMain.class);
                                intent.putExtra("name", name);
                                startActivity(intent);
                                finish();
                                type=null;
                                name=null;
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {
                            pd.dismiss();
                            Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    });

                }else{
                    pd.dismiss();
                    Toast.makeText(getApplicationContext(), task.getException().getMessage(),Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

public void signUp (View view){
    startActivity(new Intent(SignIn.this, SignUp.class));
    finish();
}

}

注册页面:

public class SignUp extends AppCompatActivity {

EditText name,email,pass;
private FirebaseAuth mAuth;
FirebaseDatabase db;
FirebaseUser user;
RadioButton Rbtn;
RadioGroup Rgroup;
DatabaseReference mRef;

boolean out = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);
    mAuth = FirebaseAuth.getInstance();
    name = findViewById(R.id.inpSignupName);
    email = findViewById(R.id.inpSignupEmail);
    pass = findViewById(R.id.inpSignupPass);
    Rgroup = findViewById(R.id.radioGroup);
    db = FirebaseDatabase.getInstance();
    mRef = db.getReference("Users/");
    Log.e("asd","Signuponcreate");
}

public void submit (View view){
    if (name.getText().toString().trim().length() < 1 || email.getText().toString().trim().length() < 1 || pass.getText().toString().trim().length() < 1){
        Toast.makeText(getApplicationContext(), "Please fill your information.", Toast.LENGTH_LONG).show();
    }else{
        mAuth.createUserWithEmailAndPassword(email.getText().toString() , pass.getText().toString()).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()){
                    Toast.makeText(getApplicationContext(),"Sign Up success!",Toast.LENGTH_LONG).show();
                    user = mAuth.getCurrentUser();
                    int radioId = Rgroup.getCheckedRadioButtonId();
                    Rbtn = findViewById(radioId);
                    if (Rbtn.getText().equals("User")){
                        mRef.child("/Normal").child(user.getUid()).child("/Name").setValue(name.getText().toString());
                        mRef.child("/Normal").child(user.getUid()).child("/Type").setValue("user");
                    }else{
                        mRef.child("/Company").child(user.getUid()).child("/Name").setValue(name.getText().toString());
                        mRef.child("/Company").child(user.getUid()).child("/Type").setValue("company");
                    }
                    startActivity(new Intent(SignUp.this, SignIn.class));
                    finish();
                    Log.e("as","signupUserGotoSignin");
                }else{
                    Toast.makeText(getApplicationContext(), task.getException().getMessage(),Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

}

这是我的日志:

E/asd: Loginoncreate(这是我看到的第一条消息,当我启动应用程序时,我登录并 go 到用户主页)

E/as: loginUser (当我第一次登录时打开并 go 到用户主页)

E/asd: Loginoncreate (当我从用户主页返回时)

E/asd: Signuponcreate (i go 创建一个新账户)

E/as:signupUserGotoSignin(我创建了帐户并想返回登录页面)

E/as:loginUser(在这里我希望再次出现 Loginoncreate 消息,但我从来没有收到,我总是收到此消息 2 次。此消息是 onDataChanged) E/as:loginUser

在我单击提交按钮创建新帐户后,它永远不会返回登录页面。 我知道 firebase 是异步的,但我不知道我在这里做错了什么。 为什么登录页面上的 onCreate 永远不会被调用,它会立即进入 onDataChanged 并将我带到用户主页?

我假设登录(查看视图)方法是您的登录按钮单击事件。 所以,

首先,您需要从按钮 XML 代码中删除onClick属性。

android:onClick="signIn"

然后,在 onCreate() 方法中创建 onClick 按钮事件。

喜欢,

Button button = findViewById(R.id.SignInbutton);
button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //put your signIn button all code here
        }
    });

在注册页面活动中也是如此。

好的,所以我将所有内容放在 onDataChange 中的 If 语句下,我在其中检查 temp 变量是否为真,并且在我将用户移动到用户主页之前,我将该变量设为假。 这解决了我的问题,但如果有人解释为什么会发生这种情况,我仍然会很感激。 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM