你好
我有一种方法可以验证数据库中是否已存在电话号码或电子邮件,如果是,用户将收到一个提示,表示其已注册,并将返回到注册 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/