2017-10-18 31 views
0

我想要做的是获取OnDataSnapshot以外的值,但始终返回null。我如何从外部访问它? 由于是异步的,它总是返回null。 我已经尝试了几乎所有堆栈溢出的方法,但都没有为我工作。 帮我把这个值从这个函数中取出来。 下面是我的代码:我已经声明字符串外我无法在Firebase的onDataSnapshot之外获得价值

final DatabaseReference grpinfo = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).child("Group"); 
    //listner not working properly 
    grpinfo.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      group = dataSnapshot.getValue().toString(); 
      //cant get this value outside 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    //returns null in Toast 
    Toast.makeText(getApplicationContext(),group,Toast.LENGTH_LONG).show(); 
+2

请在文章中包含代码的文本,而不是图片。 – ImaginaryHuman072889

+0

已尝试采取静态# –

+0

void getDataSnapShot(DataSnapshot dataSnapshot)创建函数并在外部使用它 –

回答

0

考虑到你是一个活动,你为什么不创建活动中二传手用字符串参数去保存你的数据?

private String group; 
public void setGroup(String group){ 
    this.group = group; 
} 

而在你onDataChange方法您设置组:

String group = dataSnapshot.getValue().toString(); 
setGroup(group); 
0

你是一个每个听者触发时,宣布了新的group字符串,因此试图访问听者之外group的价值范围将检索为空,因为它没有在那里定义。

从火力地堡与听众得到一个值简单:

  • 声明String group变量听者的范围之外的onDataChange
  • 简单dataSnapshot的价值分配给您的字符串,这样group变量将可用(具有其新价值)在听众范围之外。

例如

String group; 

grppinfo.addListenerForSingleValueEvent(new ValueEventListener(){ 
    @Override 
    public void onDataChange(Datasnapshot datasnapshot) { 
    group = dataSnapshot.getValue().toString(); 
    } 
    ... 
}); 

注:从数据库中检索数据时检查datasnapshot不为空,否则可能出现的情况,当你将最终抛出nullPointerException这是很好的做法。

0

不能只是声明group变量作为一个全局变量,并在代码中使用它,因为onDataChange()方法称为异步。这意味着即使您试图从数据库获取数据,您尝试显示的Toast也会被调用,这就是为什么始终是null

所以为了解决这个问题,你需要使用下面这行代码:

Toast.makeText(getApplicationContext(),group,Toast.LENGTH_LONG).show(); 

onDataChange()方法,这将肯定工作,或者如果你想使用外onDataChange()方法的价值,我建议你看到我的答案从post

0

我遇到了一个肮脏的黑客,但它的工作。我使用SharedPreferences将值存储在onDataChange中,然后使用SharedPreferences获取值。它工作正常,因为每次在数据库中更改数据时都会调用onDataChange,从而更新sharedpreferences值。这是代码。

mDatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      String name= dataSnapshot.getValue().toString(); 

      setKeys= getSharedPreferences("Name", Context.MODE_PRIVATE); 
      editKeys=setKeys.edit(); 
      editKeys.putString("name",name); 
      editKeys.apply(); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    });