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; 

} 
+0

其打印'null'值是异步 – akhilesh0707

+0

手段?我不能在外面打印? –

+0

您的打印代码在Firebase听众返回值 – akhilesh0707

数据的字符串值的函数从火力地堡异步加载,不幸意味着你想办法赢不可能

最简单的方法是通过简化您的代码只是一些日志语句:

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方法中,就像您在打印时所做的那样。

另见:因为火力地堡听众的