无法从 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
值。
我尝试从我的 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
值。