我现在怎么知道我最后一次调用ChildEventListener.onChildAdded()了?

时间:2016-12-29 20:45:49

标签: java android firebase firebase-realtime-database

假设我有一个Firebase数据库位置/foo,它现在有五个孩子。我希望在接下来的几分钟内增加更多的孩子。我在这个数据库引用上有一个子事件监听器,当我按预期添加监听器时,我立即得到五次回调onChildAdded()

只要我的Android应用程序正在运行以处理新的孩子,我就会保持我的听众,但是现在,比如,在应用启动时,我真的很感兴趣,当我有最后一个现有五个孩子。

我该怎么做?

我不想添加ValueEventListener以及ChildEventListener,因为这只是数据传输的两倍。感觉API中应该有一个Task,我可以在完成时收到回调,但我找不到它。

2 个答案:

答案 0 :(得分:1)

我现在最终使用了延迟处理程序,尽管我很乐意接受更好的答案。

class PositionListener implements ChildEventListener {

    private MyService service;

    private final Handler lastChildHandler = new Handler();

    private final Runnable lastChildRunnable = new Runnable() {
        @Override
        public void run() {
            service.onModelChanged();
        }
    };

    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
        // Omitted: Handle this child.

        // Push the time at which we let the service know the model has
        // changed and redraw the view out another 20ms. This means 
        // lastChildRunnable.run() will never actually run until after
        // the last child for a while.
        lastChildHandler.removeCallbacks(lastChildRunnable);
        lastChildHandler.postDelayed(lastChildRunnable, 20);
    }

    // Omitted: other overrides

}

答案 1 :(得分:1)

我也遇到了同样的问题。现在,这是我的解决方案:

我将addChildEventListeneraddValueEventListener放在同一DatabaseReference上。我读了一些参考文献(我忘记了,或许有人可以发表评论)说onDataChange addValueEventListener addChildEventListener将在所有UPDATE mydb SET device = '$device' WHERE Name IN (SELECT name FROM mydb WHERE device IS NULL AND Activated=1 ORDER BY id ASC LIMIT 10); 事件完成后被调用。

不是最好的解决方案,我知道,但可以是另一种选择。