当前位置: 首页 > 面试题库 >

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

卢涵畅
2023-03-14
问题内容

这只是我的代码的一个示例。现在,如果我在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

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


问题答案:

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) {
        }
    });
}


 类似资料:
  • 问题内容: 在SO和google中寻找了这个问题的答案,但找不到任何答案。 我有以下代码: 编译器返回以下内容: 从内部类内部访问局部变量变量;需要宣布为最终 为什么必须最终决定的技术原因是什么? 问题答案: 这是因为您正在使用匿名内部类。发生的是编译器为您创建了类。它将其称为您的外部类,并添加和编号,例如,等等。 该类具有对自动初始化的外部类的引用,因此其实例可以使用外部类的方法和字段。 但是您

  • #include <stdio.h> int func(void) { int i = 2; return i; } int main(void) { int a = 0; a = func(); printf("%d\n", a); return 0; } 技巧 在gdb中,可以用“set var variable=expr”命令设置变量

  • 问题内容: 我不熟悉Thymeleaf,并将Web页面从JSP转换为Thymeleaf。我有一个像这样的strut标签: 该变量可以在JSP中的任何地方使用。Thymeleaf中是否有其他替代方法? 问题答案: 你可以使用局部变量。 声明带有属性的HTML元素。例如 文档说明 当被处理时,该变量被创建为一个局部变量,并添加到变量地图从上下文来,所以它是可用于评估任何其他变量从一开始就在上下文中声明

  • 首先我想问一下这是不是可能的,设置值为全局变量在异步函数或承诺? 如果是,那么为什么每个可用的教程/网站都在教程中使用console.log(结果),但从来没有使用它将其赋值给variable。 例如:

  • 问题内容: 我有一个位置上给定用户的聊天室列表,而另一个位置上有给定聊天室的消息总数。我想跟踪用户所属聊天室中的一些消息。 我有以下片段: 问题是,稍后将调用onChildRemoved时,如何删除所有那些ValueEventListener呢?还是不再需要它们了? 建议的处理这种情况的方法是什么?我应该将子键和侦听器存储在HashMap中并自己进行跟踪,还是可以通过某种方法删除给定Firebas