在Firebase中设置onDataChange内的变量(singleValue Listener)

时间:2016-08-29 15:24:43

标签: java android firebase firebase-realtime-database

这只是我的代码的一个例子。现在,如果我在onDataChange中打印出userName变量,它可以正常工作。但是如果我尝试打印userName,在侦听器之后,它将打印'null'。我如何能够在onDataChange()中存储具有我想要的数据的变量?

public class FireBaseTest extends .... {

    String userName;

    ...

    mDatabase.child("Users").child(key).addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            // Get user value
                            userName = dataSnapshot.child("userName").getValue(String.class);
                            System.out.println(userName); //Not null
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }
                    });


    ...

    System.out.println(userName); //Null

EDIT / UPDATE: 所以在我有一个过程之前,它将采用正在倾听的价值并用它做一些事情。我只是对该过程进行了一些调整,并将其添加到onDataChanged方法中,以结束我的痛苦。虽然它并不完全令人满意,但它确实奏效了。感谢所有回答的人。

3 个答案:

答案 0 :(得分:4)

Firebase中的监听器是异步的,因此您无法设置这样的变量。您应该在已声明侦听器的函数中传递回调函数。

然后,此回调函数将从firebase调用中获取结果并对其进行进一步处理。

public void doSomething(@NotNull final Callback callback) {

    final Query query = mDatabase.child(FirebaseConstants.TARGET);

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String userName = dataSnapshot.child("userName").getValue(String.class);
            callback.OnComplete(userName);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

答案 1 :(得分:2)

Firebase事件监听器被执行Asynchrounosly,意思是,它在后台运行,一旦完成,它会使用您在案例ValueEventListener中提供的回调通知您并调用其中一个或多个方法{{1} }或onDataChanged

也就是说,打印onCancelled变量可能会显示一个值,也可能不会,这取决于是否在打印之前触发了回调。

因此,这是一种非常自然的行为,因为代码一次只会占用一行。

答案 2 :(得分:1)

这是我经常发现使用Firebase时遇到的问题。我建议的唯一真正的解决方案是确保您需要访问Firebase变量的任何代码都是:

1)在onDataChange方法中。

2)只有在addListenerForSingleValueEvent onDataChange方法完成后才调用/访问。