在Firebase中的onDataChange内设置变量(单值侦听器)

Sal*_*Sea 4 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
Run Code Online (Sandbox Code Playgroud)

编辑/更新:因此,在我进行一个处理之前,该处理将采用被监听的值并对其进行处理。我只是对该过程进行了一些调整,并将其添加到onDataChanged方法中以结束痛苦。即使不完全令人满意,它仍然有效。谢谢所有回答的人。

Ish*_*ati 6

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) {
        }
    });
}
Run Code Online (Sandbox Code Playgroud)