我需要从 Firebase 返回读取数据。代码如下:
private String getInfo(DatabaseReference reference) {
String string = "";
reference.child("xxx").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
string = snapshot.getValue().toString();
// here the log display the correct value I need
Log.i("Log", string);
}
onCancelled() ...
}
});
return string; // HERE THE VALUE IS NULL!!!!
如上面所写,日志显示了正确的值,但是当我尝试返回它时,它的值变为空。
答案 0 :(得分:0)
它在内部块内,这就是它发生的原因 将返回函数移动到块的内部,以便它显示正确的值
答案 1 :(得分:0)
首先尝试在方法主体内移动 return string;
,如果它没有帮助,请阅读下文。
addListenerForSingleValueEvent()
立即执行 onDataChange 方法,在执行一次该方法后,它停止侦听它附加到的参考位置。
所以改用 addValueEventListener()
,它会一直监听它所附加的查询或数据库引用,如这里所提到的 Read and Write Data on Android
这是官方文档中的另一个有用信息:
<块引用>侦听器收到一个包含数据的 DataSnapshot 事件发生时数据库中的指定位置。打电话 快照上的 getValue() 返回对象的 Java 对象表示 数据。如果该位置不存在数据,则调用 getValue() 返回 空。
在这个例子中,ValueEventListener 还定义了 onCancelled() 取消读取时调用的方法。例如,读取可以 如果客户端无权读取,则取消 Firebase 数据库位置。这个方法被传递了一个 DatabaseError 指示失败原因的对象。