switch (v.getId()) {
case R.id.signUpBtn:
database = FirebaseDatabase.getInstance().getReference();
myRef = database.child("users");
users = new Users();
getValue();
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
myRef.setValue(users);
Toast.makeText(getActivity(), "Data inserted....", Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
// Call checkValidation method
checkValidation();
break;
我试图使用断点无济于事,编译器直接跳到checkValidation()
,跳过了addValueEventlistener
!?
答案 0 :(得分:0)
这是真的,这是因为onDataChange
是异步的,这意味着编译器将移至另一个任务,而不会等待onDataChange
来检索其数据。
添加Log
的示例:
switch (v.getId()) {
case R.id.signUpBtn:
database = FirebaseDatabase.getInstance().getReference();
myRef = database.child("users");
users = new Users();
getValue();
Log.d(TAG,"Before add value listener");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
myRef.setValue(users);
Log.d(TAG,"inside retrieving data");
Toast.makeText(getActivity(), "Data inserted....", Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
// Call checkValidation method
Log.d(TAG, "outside retrieving data");
checkValidation();
break;
这将按以下顺序打印日志:
在添加值侦听器之前
外部检索数据
内部检索数据
要解决此问题,请在checkValidation();
内添加onDataChange
,例如:
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
myRef.setValue(users);
Log.d(TAG,"inside retrieving data");
Toast.makeText(getActivity(), "Data inserted....", Toast.LENGTH_LONG).show();
checkValidation();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});