我无法在Firebase中的onDataSnapshot之外获得价值

时间:2017-10-18 17:19:44

标签: android firebase firebase-realtime-database

我要做的是获取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();

4 个答案:

答案 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) {

        }
    });