假设我从firebase获取数据为
<Cell name="Name">First Name</Cell>
完美的工作...... 如果我尝试使用
打印该字符串名称 DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id);
mdb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name=dataSnapshot.child("name").getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//point b
它将打印该字符串。 但是,如果我想在侦听器之外使用该字符串名称,就像在第一个代码中我添加了注释//指向b
我尝试全局定义字符串名称。 但它只打印在onDatachange()内部的println ...但它会在// b点打印null ...即使我全局定义了String名称。
像
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name=dataSnapshot.child("name").getValue();
System.out.println(name);
}
修改 实际上它是一个返回字符串值的函数,如
String name;
DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id);
mdb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
name=dataSnapshot.child("name").getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//point b
答案 0 :(得分:0)
数据是从Firebase异步加载的,遗憾的是这意味着您正在尝试的方法无法实现
最简单的方法是将代码简化为一些日志语句:
DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id);
System.out.println("Before attaching listener");
mdb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("Inside onDataChange");
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // Don't ignore errors
}
});
System.out.println("After attaching listener");
当您运行此代码时,它会打印:
在附加监听器之前
附加监听器后
在onDataChange内部
这可能不您期望的输出,但完全解释了为什么您无法从函数返回name
:到return
语句时执行后,尚未从Firebase加载数据。
无法等待数据可用。即使有,也会导致您的应用程序被阻止,Android会显示臭名昭着的“应用程序无响应”对话框。
相反,您需要将打印时需要访问名称的代码移动到 onDataChange方法中。
另见:
答案 1 :(得分:0)
您无法访问onDataChange之外的变量。因此,如果您想要访问函数/方法的变量,您可以在onDataChange中实现该方法。因为onDataChange将是最后一个运行的。因此,请确保在onDataChange内完成与变量相关的任何事情。