无法从ValueEventListener内部类

时间:2017-12-03 14:42:03

标签: java android firebase-realtime-database inner-classes

我尝试从Firebase数据库中获取单个记录,并将其转换为 Kategori 类中的对象,由 id_kategor'属性决定。< / p>

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*,这也意味着attribut失败从Firebase ValueEventListener

获取它的价值

究竟是什么问题?

这是我的数据样本

enter image description here

1 个答案:

答案 0 :(得分:1)

检查2 可能会在检查1 之前运行,特别是在nama_en初始化之前。

这里的要点是addListenerForSingleValueEvent将内部类添加为侦听器,但它不会立即执行其中的代码。而是直接继续使用 Check 2 调试语句 特别是name_en已初始化onDataChange,因此调用该方法时,应该在更改任何数据时发生(我不熟悉Firebase API)。

您可以通过立即激活两个调试语句并使用String.valueOf(Object o)来检查此行为,这样您就不会遇到NPE,但仍会看到null值。