Java Firebase始终在for each循环后返回null
我想从Java Firebase始终在for each循环后返回null,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想从Firebase提取数据库。在for each循环中,它向我显示来自数据库的描述,但在for each循环之后,当我再次检查该描述时,它向我显示null,不仅显示description的描述,还显示所有其他值的描述。以下是从Firebase提取数据的代码。它没有显示任何类型的错误。帮帮我 public void getDatafromFirebase(){ reference.addValueEventListener(new ValueEventListener() {
Firebase
提取数据库。在for each循环中,它向我显示来自数据库的描述
,但在for each循环之后,当我再次检查该描述时,它向我显示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();
}
});
}
如果我理解正确,您正试图在回调之外记录
description
属性(或任何其他属性)的值,您得到的是null
,对吗
之所以会发生这种情况,是因为Firebase API是异步的,这意味着调用onDataChange()
方法后会立即返回,并且它返回的任务的回调将在稍后调用。无法保证需要多长时间。因此,在数据可用之前,可能需要几百毫秒到几秒钟的时间。由于该方法立即返回,因此您试图在onDataChange()
方法之外使用的description
属性的值尚未从回调中填充
基本上,您尝试从异步API同步返回一个值。那不是个好主意。您应该按照预期异步处理API
这个问题的一个快速解决方法是仅在
onDataChange()
方法中使用description
值,否则我建议您从中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您还可以查看此以更好地理解。详细信息在哪里声明?另外,列表
在哪里声明?看起来您的问题可能是在每个循环迭代中使用相同的详细信息对象,因此数据被覆盖。如果不知道它们是在哪里声明的,很难说。它们是在类之前声明的。你可以发布完整的代码,包括它们声明的位置吗?但看起来确实是这样。我认为您可能也有异步问题。数据更改时的回调是异步的。因此,如果您正在调用getDatefromFirebase()
,那么在下一行检查列表时,由于异步回调尚未运行,因此该列表将在该点为空。我查看了您的代码,但我想知道,当我的适配器在onDataChange()方法中发出通知时,它也会返回空值。。。。。为什么???<代码> null <代码>。由于同样的原因。你也可以等待其他的答案,但是如果你认为我的答案对你有帮助,请考虑点击点击箭头左侧的复选标记来接受它。应该把颜色改成绿色。我会很感激的。谢谢