android firebase从datasnapshot获取字符串到外部 [英] android firebase get string from datasnapshot to the outside

查看:158
本文介绍了android firebase从datasnapshot获取字符串到外部的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我从firebase获取数据为
$ b $ pre $ database $ DatabaseReference mdb = FirebaseDatabase.getInstance()。getReference(users /) + ID);
mdb.addValueEventListener(new ValueEventListener(){
$ b $ @Override
public void onDataChange(DataSnapshot dataSnapshot){
String name = dataSnapshot.child(name) .getValue();
}

@Override
public void onCancelled(DatabaseError databaseError){



} );

//点b

$ b如果我尝试打印字符串名称使用

  @Override 
public void onDataChange(DataSnapshot dataSnapshot){
String name = dataSnapshot.child(name)。getValue();
System.out.println(name);
}

它将打印该字符串。
,但是如果我想要在侦听器外部的字符串名称,就像在第一个代码中,我添加了一个注释//点b



,我试着定义字符串名称全球。
,但它只打印在onDatachange()内的println,但它将在//点b处打印null ...即使我全局定义了字符串名称。





 字符串名称; 
DatabaseReference mdb = FirebaseDatabase.getInstance()。getReference(users /+ id);
mdb.addValueEventListener(new ValueEventListener(){
$ b @Override
public void onDataChange(DataSnapshot dataSnapshot){
name = dataSnapshot.child(name)。 getValue();
}

@Override
public void onCancelled(DatabaseError databaseError){


$ b}) ;

//点b

编辑
实际上是一个返回字符串值的函数,如

  public String getData(String id)
{
字符串名称;
DatabaseReference mdb = FirebaseDatabase.getInstance()。getReference(users /+ id);
mdb.addValueEventListener(new ValueEventListener(){
$ b @Override
public void onDataChange(DataSnapshot dataSnapshot){
name = dataSnapshot.child(name)。 getValue();
}

@Override
public void onCancelled(DatabaseError databaseError){


$ b}) ;

返回名称;

$ b $ / code $ / pre

解决方案

不幸的是,你尝试的方法是不可能的。

最简单的方法是将代码简化为一些日志语句:

$ p $ DatabaseReference mdb = FirebaseDatabase.getInstance()。getReference(users /+ id);
System.out.println(附加侦听器之前);
mdb.addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
System.out.println(Inside onDataChange);
}
$ b $ @覆盖
public void onCancelled(DatabaseError databaseError){
throw databaseError.toException(); //不要忽略错误
}

});
System.out.println(附加监听器之后);

当你运行这段代码时,它会输出:

< blockquote>

在附加监听器之前附加监听器

在onDataChange中

>

这可能是不是您所期望的输出,但可以很好地解释为什么您无法返回 name 从您的函数中执行:当您执行 return 语句时,尚未从Firebase载入数据。 / p>

无法等待数据可用。即使有,它会导致你的应用程序被阻止,Android显示臭名昭着的应用程序不响应对话框。



相反,你需要移动代码需要访问名为 on onDataChange方法,就像您在打印时所做的那样。



另请参阅:

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆