假设我有一个Firebase数据库位置/foo
,它现在有五个孩子。我希望在接下来的几分钟内增加更多的孩子。我在这个数据库引用上有一个子事件监听器,当我按预期添加监听器时,我立即得到五次回调onChildAdded()
。
只要我的Android应用程序正在运行以处理新的孩子,我就会保持我的听众,但是现在,比如,在应用启动时,我真的很感兴趣,当我有最后一个现有五个孩子。
我该怎么做?
我不想添加ValueEventListener
以及ChildEventListener
,因为这只是数据传输的两倍。感觉API中应该有一个Task
,我可以在完成时收到回调,但我找不到它。
答案 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)
我也遇到了同样的问题。现在,这是我的解决方案:
我将addChildEventListener
和addValueEventListener
放在同一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);
事件完成后被调用。
不是最好的解决方案,我知道,但可以是另一种选择。