java - 为什么这个 toast 在不应该出现的时候出现了?

标签 java android class methods toast

你好

我有一种方法可以验证数据库中是否已存在电话号码或电子邮件,如果是,用户将收到一个提示,表示其已注册,并将返回到注册 Activity ,如果不存在,它将继续使用代码,

public class VerficatePhone extends AppCompatActivity {
private String mVerficationId,phoneNumber,sentCode;
private User user;
private EditText phoneCodeEditText;
private PhoneAuthProvider.ForceResendingToken mResend;
private Button activate;
private TextView backToSignupText;
private ProgressBar pBar;
private FirebaseAuth mAuth;
private DatabaseReference reff;
private boolean executed =false;



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

    phoneCodeEditText=findViewById(R.id.verificationEditText);
    activate=findViewById(R.id.activate);
    backToSignupText=findViewById(R.id.backToSignupText);
    pBar=findViewById(R.id.progressBar);

    mAuth=FirebaseAuth.getInstance();
    reff= FirebaseDatabase.getInstance().getReference().child("User");


    //getting the user that has been sent from the sign up Activity and the phone number
    if(getIntent().getSerializableExtra("userFromSignUp")!=null)
    {
        user=(User)getIntent().getSerializableExtra("userFromSignUp");
        phoneNumber=user.getPhoneNumber();

    }
    else
    {
        phoneNumber="000";
        Toast.makeText(this,"Error",Toast.LENGTH_SHORT).show();
    }

    if(!executed)
    {
        checkPhoneNumIfExists(user);
        executed =true;
    }

    sendCode(phoneNumber);
}

我的 checkPhoneNumIfExists 方法是这样的

 private void checkPhoneNumIfExists (final User currentUser)
{
    Log.i("checkPhoneNumIfExists method","processing");
     FirebaseDatabase fDb=FirebaseDatabase.getInstance();
        DatabaseReference dbRef=fDb.getReference();
        dbRef.child("User").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Iterable<DataSnapshot> children=dataSnapshot.getChildren();
                for(DataSnapshot child:children)
                {
                    if(currentUser!=null && child!=null)
                    {
                        User user= child.getValue(User.class);
                        if(user!=null && !user.getPhoneNumber().isEmpty())
                        {
                            if(currentUser.getPhoneNumber().equals(user.getPhoneNumber()) || currentUser.geteMail().equals(user.geteMail()))
                            {
                                Toast.makeText(VerficatePhone.this,"already registred",Toast.LENGTH_SHORT).show();
                                Intent i =new Intent(VerficatePhone.this,signUpActivity.class);
                                i.putExtra("userFromVerificate",currentUser);
                                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                startActivity(i);
                                finish();



                            }
                        }

                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    executed =true;

}

所以这就是问题所在,当用户未注册时,它会继续执行代码并在 onCreate 方法中执行 sendCode 方法,这将打开一个新 Activity ,但每当从 sendCode 方法打开新 Activity 时, checkPhoneNumIfExists 方法的 toast它出现了。

那为什么会发生这种情况?

最佳答案

onDataChange() 是一个异步回调。任何依赖它的数据或函数都应该从回调中访问或触发。

由于您似乎不打算每次都运行数据库检查,因此我建议您在离开并返回 Activity 时查看 SharedPreferences 以保留该变量。您可以在执行 onDataChange() 时存储 executed 的值,并在 if 语句之前的 onCreate() 中检索该值。

@Override
protected void onCreate(Bundle savedInstanceState){
    // ...

    // If you're using SharedPreferences, retrieve the value here

    if(!executed){
        checkDb(user)
    }else{
        // I'm assuming you only want to send the code when executed is true
        // which means that, for this approach, you should call sendCode()
        // again inside of your onDataChange()
        sendCode(phoneNum);
    }
}

private void checkDb(final User currentUser){
    // ...

    myRef.addValueEventListener(new ValueEventListener(){
        @Override
        public void onDataChange(DataSnapshot dataSnapshot){
            for(DataSnapshot snap: dataSnapshot.getChildren()){
                // do something with the data
                // ...
            }

            // This is where you can set the value of a variable 
            // or execute a function that relies upon the data of the callback. 

            // If you're using SharedPreferences, you would store the value here.

            // You may want to call sendCode() again here
        }
    });
}

您可以通过访问 https://developer.android.com/training/data-storage/shared-preferences 了解 SharedPreferences

关于java - 为什么这个 toast 在不应该出现的时候出现了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60458524/

相关文章:

java - 替换数组中的字符串并将其保留在内存中?

android - 根据项目中的 TextView 更改 ListView 行颜色

arrays - 为什么 VBA 类不能通过 ByRef Array()?

java单例实例化

java - XML 到 JSON - 转换列表时出现意外行为?

android - 发布应用程序后更改 list 中的应用程序名称

java - Android IO 慢?

Python:从导入类调用方法

c++ - 如何使用派生类从基类设置字符串数据成员?

java - 如何让 Watson Conversation Api 在用户输入时调用 Web 应用程序 Url?