我要做的是获取OnDataSnapshot
之外的值,但它总是返回null
。我如何从外面访问它?
由于异步,它总是返回null。
我已经尝试了Stack Overflow的几乎所有方法,但没有一个对我有效。
帮助我从该功能中获取此值。
下面是我的代码:我已声明String Outside
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();
答案 0 :(得分:0)
考虑到您参与某项活动,为什么不在活动中使用字符串参数创建一个setter来保存您的数据?
private String group;
public void setGroup(String group){
this.group = group;
}
在你的onDataChange方法中设置你的组:
String group = dataSnapshot.getValue().toString();
setGroup(group);
答案 1 :(得分:0)
每次侦听器触发时,您都声明一个新的group
字符串,因此尝试在侦听器范围之外访问group
的值将检索为null那里没有定义。
只需通过监听器从Firebase获取值:
String group
变量onDataChange
中dataSnapshot
的值分配给您的字符串,这样group
变量将在侦听器之外可用(及其新值)& #39;范围。E.g。
String group;
grppinfo.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(Datasnapshot datasnapshot) {
group = dataSnapshot.getValue().toString();
}
...
});
注意:从数据库检索数据以检查datasnapshot
是否为空时,这是一种很好的做法,否则可能会出现最终导致nullPointerException
抛出的情况。
答案 2 :(得分:0)
你不能只是将group
变量声明为全局变量,并在代码中的任何地方使用它,因为onDataChange()
方法称为异步。这意味着,即使您尝试从数据库中获取数据,也会调用您尝试显示的Toast
,这就是为什么始终为null
。
因此,为了解决这个问题,您需要使用以下代码:
Toast.makeText(getApplicationContext(),group,Toast.LENGTH_LONG).show();
在onDataChange()
方法内,它肯定会有用,或者如果您想在onDataChange()
方法之外使用该值,我建议您从post看到我的答案。
答案 3 :(得分: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) {
}
});