Это плохой подход?
Нет, это не так!Вы должны обязательно удалить слушателя, когда он больше не нужен.Я предполагаю, что вы добавляете слушателя в свой метод onStart()
и удаляете его в своем onStop()
методе своей деятельности, верно?Если это так, пожалуйста, обратите внимание, что это нормальное поведение, поскольку оба метода являются частью жизненного цикла действия и вызываются каждый раз, когда меняется ориентация.Таким образом, каждый раз, когда происходит переориентация, деятельность разрушается и воссоздается заново.Пожалуйста, смотрите больше информации:
Если вы хотите более элегантный способ удалить слушателя, вы должны увидеть последнюю часть моего ответа из этого сообщение .Таким образом, вы можете передать действие в качестве первого аргумента в методе addSnapshotListener () , и слушатель будет автоматически удален для вас.
Редактировать:
Согласно вашему комментарию, вы правы.Даже если вы используете это решение, количество подключенных и удаленных слушателей будет одинаковым.В этом случае у меня есть решение, которое может уменьшить это число.
private boolean pending = false;
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
//Remove listener
pending = false;
}
};
@Override
protected void onStart() {
super.onStart();
if (pending) {
handler.removeCallbacks(runnable);
} else {
//Attach listener
}
pending = false;
}
@Override
protected void onStop() {
super.onStop();
handler.postDelayed(runnable, 3000);
pending = true;
}
Это означает, что Handler
запланирует удаление вашего слушателя с помощью обратного вызова Runnable
, который фактически выполнитудаление через три секунды после звонка на onStop()
.Я установил задержку на три секунды для изменения ориентации, но в реальной ситуации она обычно намного быстрее даже на старых телефонах.
Так что, если ориентация быстрее, чем эти три секунды, мы просто удаляем обратные вызовы ипозволить слушателю продолжать слушать.Это, очевидно, означает, что вы уменьшаете количество удалений слушателя.
Это также будет очень полезно, потому что будет , а не второй круговой обход к и от сервера Firestore, чтобы опуститьданные, даже если результаты не изменились.