2016-01-13 2 views
0

Я использую базу данных firebase для своего приложения для Android. Я установил ChildEventListener для одного из узлов firebase. Когда немедленный дочерний элемент этого узла удален, onChildRemoved() следует вызывать только один раз, но в моем случае он вызывается несколько раз.onChildRemoved(), вызываемый несколько раз

Причина, я думаю, почему это происходит потому, что я поставил ChildEventListener для того же узел в нескольких местах по всему моему приложению, потому что, когда я установил ChildEventListener один раз в моем приложении, метод onChildRemoved() вызывается один раз за ребенком удален, который как ожидалось.

фрагмента А

firebaseData.child("patients").addChildEventListener(new ChildEventListener() { 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) 
    { 
     dataChangedforListviewInFragmentA(dataSnapShot); 
    } 
}); 

Фрагмент B

firebaseData.child("patients").addChildEventListener(new ChildEventListener() { 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) 
    { 
     dataChangedforListviewInFragmentB(dataSnapShot); 
    } 
}); 

Фрагмент С

firebaseData.child("patients").addChildEventListener(new ChildEventListener() { 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) 
    { 
     dataChangedforListviewInFragmentC(dataSnapShot); 
    } 
}); 

В методе dataChangedforListviewInFragment() Я установил listView, используя обновленные данные. Когда сразу дочерний узел patients удаляет onChildRemoved() в Fragment C, вызывается несколько раз.

Можно ли написать ChildEventListener в нескольких местах в моем приложении и все же получить его методы обратного вызова, чтобы их вызывало нужное количество раз. Благодарю.

+0

В следующий раз, вместо описания кода, пожалуйста, укажите минимальный код, чтобы воспроизвести вашу проблему в вопросе. –

+0

Извините, но здесь нет минимального кода. Существует либо код, либо код, который бы сделал интуитивный счетчик вопросов. Вопрос сам по себе сам объясняется, если вам что-то неясно, я бы с удовольствием объяснил более детально, если это необходимо. –

ответ

1

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

Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts"); 
// Create a listener 
ValueEventListener listener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     System.out.println(snapshot.getValue()); 
    } 
    @Override 
    public void onCancelled(FirebaseError firebaseError) { 
    } 
}; 
// Attach listeners to read the data at our posts reference 
ref.addValueEventListener(listener); 
ref.addValueEventListener(listener); 

С выше настройки, когда значение posts изменений, слушатель будет вызван дважды, и новое значение будет напечатана дважды. Это именно то, что должно произойти.

Если вы хотите, чтобы прослушиватель вызывался один раз, вы должны только добавить его к ссылке один раз. Это можно легко сделать, отслеживая, если вы уже добавили его.

boolean isListenerAdded = false; 
// then in the first place you'r adding a listener, the code will be executed 
if (!listenerAdded) { 
    ref.addValueEventListener(listener); 
    isListenerAdded = true; 
} 
// and in the other place, the code will be skipped 
if (!listenerAdded) { 
    ref.addValueEventListener(listener); 
    isListenerAdded = true; 
} 

Если слушатели находятся в пределах того же фрагмента/активности, вы можете просто сохранить логическое значение в поле члена деятельности. Если слушатели находятся в разных действиях, вы можете сохранить логическое значение в SharedPreferences. Но вы должны действительно рассмотреть в этом случае removing the listeners в каждом действии onPause().

@Override 
public void onPause() { 
    super.onPause(); // Always call the superclass method first 

    if (listenerAdded) { 
     ref.removeEventListener(listener); 
    } 
} 
+0

У меня есть три слушателя, разбросанных по трем различным фрагментам. Я в идеале хочу установить только один прослушиватель, но не могу, потому что я использую значение из слушателя, чтобы установить «listviews» в каждом из фрагментов. Если я установил только один прослушиватель, скажем в моем «фрагменте A», тогда данные, поступающие из этот слушатель также будет и в двух других фрагментах, что сделает код сложным.Хотя удаление слушателей на 'onPause()' должно, вероятно, поможет мне. Если есть лучшая альтернатива (шаблон дизайна) для моей проблемы, пожалуйста, предложите. Спасибо. –

+0

Я не вижу проблемы. Если у вас есть два места, где вам нужно добавить одни и те же данные в другое представление, использование двух слушателей будет идеальным. Примечание: данные будут извлекаться только один раз, если это вызывает беспокойство. Но если это не так, подумайте о том, чтобы добавить к вашему вопросу минимальное воспроизведение вашей проблемы, чтобы помочь мне понять проблему. См. Http://stackoverflow.com/help/mcve –

+0

Добавили код на вопрос, пожалуйста, проверьте. –

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