我想从Firebase
中提取数据库。在for每个循环中,它显示了database
的描述,但是在for每个循环之后,当我再次对其进行检查时,它显示了null
,不仅显示了description
,还显示了所有其他值也是如此。这是用于从Firebase
提取数据的代码。它没有显示任何类型的错误。救救我。
public void getDatafromFirebase(){
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
DataSnapshot Videoreference = dataSnapshot.child("Videos");
for (DataSnapshot videoschild : Videoreference.getChildren()){
DataSnapshot description = videoschild.child("Description");
DataSnapshot duration = videoschild.child("Duration");
DataSnapshot title = videoschild.child("Title");
DataSnapshot thumbnail = videoschild.child("Thumbnail");
details.setDescription(String.valueOf(description.getValue()));
details.setDuration(String.valueOf(duration.getValue()));
details.setTitle(String.valueOf(title.getValue()));
details.setThumbnail(String.valueOf(thumbnail.getValue()));
Log.e("details",details.description);
list.add(details);
}
Log.e("Size",list.get(0).description);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
答案 0 :(得分:0)
如果我正确理解,您正在尝试在回调之外记录description
属性(或任何其他属性)的值,并且您得到null
,对吗?
发生这种情况是因为Firebase API是asynchronous
,这意味着onDataChange()
方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后被调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试在description
方法之外使用它的onDataChange()
属性的值。
基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。
此问题的快速解决方案是仅在description
方法内使用onDataChange()
值,否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。