2016-12-29 3 views
2

Предположим, у меня есть база данных базы данных Firebase, /foo, у которой сейчас есть пять детей. Я ожидаю, что в ближайшие несколько минут будет добавлено больше детей. У меня есть прослушиватель дочерних событий в этой ссылке базы данных, и я получаю пять вызовов обратно до onChildAdded() сразу же, когда я добавляю слушателя, как ожидалось.Как узнать, когда я последний раз звонил в ChildEventListener.onChildAdded(), пока?

Я собираюсь оставить слушателя до тех пор, пока мое приложение Android работает для обработки новых детей, но пока, скажем, при запуске приложения, меня действительно интересует, когда у меня есть последний существующих пяти детей.

Как это сделать?

Я не хочу добавлять ValueEventListener, а также ChildEventListener, так как это только удваивается при передаче данных. Похоже, что где-то в API должно быть Task, с которого я могу получить обратный вызов после завершения, но я не могу его найти.

+0

Возможно, используйте [это?] (Https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html#getChildrenCount--). Затем держите под рукой счетчик каждый раз, когда добавлен ребенок. –

+0

«... так как это просто удваивается при передаче данных». Вы в этом уверены? – cartant

ответ

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

Я тоже пошел к тем же проблемам. И на данный момент вот мое решение:

Я положил addChildEventListener и addValueEventListener на том же DatabaseReference. Я прочитал некоторые ссылки (я забыл, может быть, кто-то может прокомментировать это) говорит, что onDataChange из addValueEventListener будет называться после завершения всего события addChildEventListener.

Не лучшее решение, я знаю, но может быть другим вариантом.

Смежные вопросы