Android 获取实际值后获取空值
日志 在这里,首先在Log和toast中,我得到了一些时间的实际值,过了一段时间,它变为null。我的控制台和代码截图是, 我的firebase数据库结构是Android 获取实际值后获取空值,android,firebase,android-studio,firebase-realtime-database,Android,Firebase,Android Studio,Firebase Realtime Database,日志 在这里,首先在Log和toast中,我得到了一些时间的实际值,过了一段时间,它变为null。我的控制台和代码截图是, 我的firebase数据库结构是 在这里,首先在Log和toast中,以及texview中,我得到了一些时间的实际值,过了一段时间,它变为null。根据您的数据库,您应该在没有循环的情况下提取这样的值: { "123456" : { "BT" : 98.9, "DBP" : 80, "HR" : 90, "SBP" : 125.5
在这里,首先在Log和toast中,以及texview中,我得到了一些时间的实际值,过了一段时间,它变为null。根据您的数据库,您应该在没有循环的情况下提取这样的值:
{
"123456" : {
"BT" : 98.9,
"DBP" : 80,
"HR" : 90,
"SBP" : 125.5
},
"Patients" : {
"I6nb3CB52ARmWtfpA5ZRpLjiNbx1" : {
"age" : "22",
"devID" : "123456",
"eillness" : "Corona",
"email" : "asdf@gmail.com",
"fname" : "asdf",
"lname" : "jkl"
}
}
}
您的
.addValueEventListener(listener)
是异步工作的。您现在无法返回尚未加载的内容。因此,您将首先返回字段null,在调用完成后,您的侦听器将被调用。但是您的字段已经返回。您可以通过放置几个日志语句来看到这一点:
为了解决这个问题,无论您是否编写自己的侦听器,如:
databaseReferences= FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//if the value is double use : (double value = dataSnapshot.child("BT").getValue(Double.class);)
float value = dataSnapshot.child("BT").getValue(Float.class);
mbt= String.valueOf(value);
Log.d("myTag", "This is my message"+mbt);
Toast.makeText(getApplicationContext(),"Hi"+mbt,Toast.LENGTH_SHORT).show();
bt.setText(mbt);
}
.......
并且做:
interface MyCallback{
void onSuccess(String BT)
}
请参考尝试使用AddListener for SingleValueEvent而不是addValueEventListener我不确定是否同时使用相同对象数据库引用和引用更改,但是为了避免错误,我为它们中的每一个都创建了一个对象,如果OnDataChange中的ID不存在,请检查它,它将带您到onCancelled,并在此中执行适当的过程 您可以检查以下代码:
嗨,先生,@Hasan Bou Taam,我已经更新了不完整的代码。你能检查一下吗?嗨,先生,@Shehan Wisumperuma,我已经更新了不完整的代码。你能检查一下吗?嗨,先生,@Sinan Dönmez,我已经更新了不完整的代码。你能检查一下吗?嗨,先生,@Adel B-Lahlouh,我已经更新了不完整的代码。你能检查一下吗?我已经修改了我的答案,兄弟,我希望我已经解决了你的问题@jeevankotian
databaseReferences= FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//if the value is double use : (double value = dataSnapshot.child("BT").getValue(Double.class);)
float value = dataSnapshot.child("BT").getValue(Float.class);
mbt= String.valueOf(value);
Log.d("myTag", "This is my message"+mbt);
Toast.makeText(getApplicationContext(),"Hi"+mbt,Toast.LENGTH_SHORT).show();
bt.setText(mbt);
}
.......
interface MyCallback{
void onSuccess(String BT)
}
public void getData(MyCallback callback) {
databaseReferences= FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()){
mbt= String.valueOf(ds.child("BT").getValue());
Log.d("myTag", "This is my message"+mbt);
Toast.makeText(getApplicationContext(),"Hi"+mbt,Toast.LENGTH_SHORT).show();
bt.setText(mbt);
}
callback.onSuccess(String BT);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
patient=mFirebaseAuth.getCurrentUser();
refPatients=FirebaseDatabase.getInstance().getReference("Patients");
refPatients.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// I have modified this line and checked it inside OnDataChange if it exists or not.
if(dataSnapshot.hasChild(Objects.requireNonNull(patient.getUid()))){
for (DataSnapshot ds : dataSnapshot.child(Objects.requireNonNull(patient.getUid())).getChildren()){
deviceId = String.valueOf(ds.child("devID").getValue());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
//You can make sure to undo correctly and read the error if no value is retrieved from Logcat
Log.d("ErrorRef",databaseError.getMessage();
);
}
});
refDeviceId=FirebaseDatabase.getInstance().getReference(deviceId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("BT")){
Stringmbt = String.valueOf(dataSnapshot.child("BT").getValue());
bt.setText(mbt);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});