Android的火力得到datasnapshot串到外面
问题描述:
假如我是从火力为Android的火力得到datasnapshot串到外面
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
其正常使用....获取数据 如果我尝试打印使用
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name=dataSnapshot.child("name").getValue();
System.out.println(name);
}
该字符串名称
它将打印该字符串。 但如果我想在侦听器之外的字符串名称,如在第一个代码中,我已经添加了一个注释//点b
我试着在全局定义字符串名称。 但它只打印在onDatachange()中的println ...但它将在//点b处打印null ...即使我全局定义了字符串名称。
像
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
编辑 实际上它返回像
public String getData(String id)
{
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) {
}
});
return name;
}
答
数据的字符串值的函数从火力地堡异步加载,不幸意味着你想办法赢不可能
最简单的方法是通过简化您的代码只是一些日志语句:
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方法中,就像您在打印时所做的那样。
另见:因为火力地堡听众的
其打印'null'值是异步 – akhilesh0707
手段?我不能在外面打印? –
您的打印代码在Firebase听众返回值 – akhilesh0707