【问题标题】:Firebase database: ChildEventListener is firing multiple timesFirebase 数据库:ChildEventListener 多次触发
【发布时间】:2021-03-07 18:59:48
【问题描述】:

在应用程序启动时,ChildEventListener 会触发 firebase 数据库中存在的子数量。例如,如果我的数据库中已经有 3 个孩子,那么当我启动我的应用程序时,侦听器将被调用 3 次。 s 我已经在我的服务类中定义了监听器的代码,并且我正在从我的 Splash 类启动服务。

来自 SplashScreen.class

startService(new Intent(this , BackgroundService.class));

来自 BackgroundService.class

listenToJob()方法,在Service的onStartCommand()方法中

 private void listenToJob (){


        String collectionName = "rideRequest";
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference(collectionName);


        ChildEventListener childEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

             
                Toast.makeText(BackgroundService.this, "Hey, new child is added.", Toast.LENGTH_SHORT).show();
                OnChildCreated(snapshot);
            }



            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };

        myRef.addChildEventListener(childEventListener);

    }

我不知道是什么导致了这种行为。 onChildAdded() 方法不应该只在将新子添加到数据库时调用吗?我的数据库中已经有 3 个孩子,当我打开我的应用程序时,这个 onChildAdded() 方法被调用了 3 次。

我希望这个方法只有在将孩子添加到数据库时才会启动!

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    根据listening for child events 上的 Firebase 文档,onChildAdded

    为每个现有的孩子触发一次,然后每次将新的孩子添加到指定路径时再次触发。

    所以你看到的是预期的行为。

    如果您只想了解新孩子,您需要有一些东西来定义孩子何时是“新”。例如,如果您使用 Firebase 的内置 push() 方法生成子节点,则可以使用生成的键仅获取开始侦听后生成的子节点:

    String key = myRef.push().getKey()
    myRef.orderByKey().startAt(key).addChildEventListener(childEventListener);
    

    【讨论】:

    • 抱歉,回复晚了,感谢您的宝贵时间。是的,现在我了解了 firebase 实时监听器的工作原理。我必须做很多事情才能让它根据我的需要工作。如果你能澄清一下,那么如果我有一个关于我的启动活动的监听器,并且我在数据库中有 1000 个具有 1000 个字段的孩子。所以每次我打开我的应用程序时,这些孩子都会被获取。它不会对我每次打开应用程序时获取/下载 1000x1000 数据的成本产生巨大影响吗?
    • 要确定成本,我建议使用 Firebase pricing page 底部的计算器。为了最大限度地降低成本,请仅加载您向用户显示的数据,他们似乎不太可能在每次应用首次加载时查看一百万个字段。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2018-08-02
    • 2019-02-12
    • 2017-08-25
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多