Android 获取实际值后获取空值

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中,我得到了一些时间的实际值,过了一段时间,它变为null。我的控制台和代码截图是,

我的firebase数据库结构是


在这里,首先在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) {

                    }
                });