无法从 ValueEventListener 内部读取值 class

Can't read value from ValueEventListener inner class

我尝试从我的 Firebase 数据库中获取单个记录并将其转换为来自 Kategori class 的对象,由其 [=13= 确定]'个属性。

public class Kategori {

  private String nama_id;
  private String nama_en;
  private String id_kategori;
  private Integer jml_item = 0;
  private Integer jml_brand = 0;

  public Kategori(){}

  public Kategori(String id_kategori) {
    this.id_kategori = id_kategori;
    this.fetchData();
  }

  private void fetchData(){
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("kategori");

    myRef.child( this.id_kategori ).addListenerForSingleValueEvent(new ValueEventListener (){

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if( dataSnapshot.exists() ){
                String nama_en = dataSnapshot.child("nama_en").getValue(String.class);
                String nama_id = dataSnapshot.child("nama_id").getValue(String.class);

                Kategori.this.nama_en = nama_en;
                Kategori.this.nama_id = nama_id;

                Log.d(">>>>>> CHECK 1 >>>>>",Kategori.this.nama_en);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    //Log.d(">>>>>> CHECK 2 >>>>>",this.nama_en);
  }
}

我希望所有属性都能从 Firebase 获得正确的值。

带有标签 CHECK 1 的日志显示了正确的结果,这意味着成功从 Firebase 获取了它的值。 但是带有标签 CHECK 2 的日志给我 运行-时间错误 *"java.lang.NullPointerException: println needs a message"*,这意味着 **'nama_en'** 属性具有 *null* 值,也意味着属性无法从 Firebase ValueEventListener

中获取它的值

到底是什么问题?

这是我的数据样本

检查 2 可能 运行 在 检查 1 之前,尤其是在 nama_en 初始化之前。

这里的重点是addListenerForSingleValueEvent把里面的class添加为监听器,但是并没有立即执行里面的代码。相反,它直接继续 Check 2 调试语句。
特别是 name_en 被初始化 onDataChange,因此当调用该方法时,无论数据发生什么变化都应该发生(我不熟悉 Firebase API)。

您可以通过同时激活两个调试语句并可能使用 String.valueOf(Object o) 来检查此行为,因此您不会 运行 进入 NPE,但仍会看到 null 值。