【问题标题】:How to use a value outside dataSnapshot function?如何使用 dataSnapshot 函数之外的值?
【发布时间】:2019-05-23 21:52:06
【问题描述】:

在下面的代码中,我得到了孩子的数量,但我想在 onDataChange 方法之外使用它。

              mRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot)
                    {
                        DateStorage dateStorage = null;
                        for (DataSnapshot result : dataSnapshot.getChildren()) 
                    {


                     Log.e(result.getKey(),result.getChildrenCount() + "");
                      in[0] = result.getChildrenCount();

                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

谁能帮帮我?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    数据是从 Firebase 异步加载的。您的主代码在数据加载时继续运行,然后在数据可用时调用onDataChange 方法。如果您添加一些日志语句,最容易看出这意味着什么:

    Log.d("TAG", "Before attaching listener");
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            Log.d("TAG", "Got data");
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
    Log.d("TAG", "After attaching listener");
    

    当您运行此代码时,它会记录:

    附加监听器之前

    附加监听器后

    得到数据

    这可能不是您期望的顺序,但在调用异步 API 时是完全正常的。它解释了为什么如果在onDataChange() 之外打印它会得到错误的值。

    问题不是你不能使用onDataChange()之外的数据,问题是你必须确保onDataChange()在你使用数据之前运行。 p>

    最简单的方法是将需要数据库中数据的所有代码放入 onDataChange 方法中。但是您也可以创建自己的回调接口,并将其传递给加载数据的方法。有关这两种方法的示例,请在此处查看我的答案:getContactsFromFirebase() method return an empty list

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 2022-01-21
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      相关资源
      最近更新 更多