android firebase从datasnapshot获取字符串到外部 [英] android firebase get string from datasnapshot to the outside
问题描述
$ 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方法,就像您在打印时所做的那样。
另请参阅: suppose i am getting data from firebase as its working perfectly....
if i try to print that string name using it will print that string.
but what if i want that string name outside the listener, like in first code where i have added a comment //point b i tried defining string name globally.
but it only prints the println which is inside onDatachange()... but it will print null at //point b...even if i defined the String name globally. like edit
actually its a function returning a string value like
Data is loaded from Firebase asynchronously, which unfortunately means that the approach you're trying won't be possible The easiest way to see this is by simplifying your code to just some log statements: When you run this code it prints: Before attaching listener After attaching listener Inside onDataChange That is probably not the output you expected, but explains perfectly why you're not able to return the There is no way to wait for the data to come available. Even if there was, it'd lead to your application being blocked and Android displaying the infamous "Application Not Responding" dialog. Instead you will need to move the code that needs access to the name into the onDataChange method as you've done when printing it. Also see: 这篇关于android firebase从datasnapshot获取字符串到外部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
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);
}
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");
name
from your function: by the time your return
statement is executed, the data hasn't been loaded from Firebase yet.