android firebase从datasnapshot获取字符串到外部

时间:2017-10-09 11:51:45

标签: android firebase firebase-realtime-database

假设我从firebase获取数据为

<Cell name="Name">First Name</Cell>

完美的工作...... 如果我尝试使用

打印该字符串名称
    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

它将打印该字符串。 但是,如果我想在侦听器之外使用该字符串名称,就像在第一个代码中我添加了注释//指向b

我尝试全局定义字符串名称。 但它只打印在onDatachange()内部的println ...但它会在// b点打印null ...即使我全局定义了String名称。

@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

2 个答案:

答案 0 :(得分:0)

数据是从Firebase异步加载的,遗憾的是这意味着您正在尝试的方法无法实现

最简单的方法是将代码简化为一些日志语句:

    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方法中。

另见:

答案 1 :(得分:0)

您无法访问onDataChange之外的变量。因此,如果您想要访问函数/方法的变量,您可以在onDataChange中实现该方法。因为onDataChange将是最后一个运行的。因此,请确保在onDataChange内完成与变量相关的任何事情。