Как ограничить количество добавления и удаления слушателя в Firestore? - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю приложение для викторины.Вопросы в приложении основаны на некоторых значениях, которые постоянно меняются.Поэтому я использую addSnapshotListener() для получения каждого изменения, внесенного в базу данных. docs означает, что я должен удалить слушателя, и это нормально, но проблема в том, что в моем приложении ориентация меняется очень часто.Это означает, что я присоединяю и удаляю слушателя слишком много раз.Это плохой подход?Как это решить?

1 Ответ

0 голосов
/ 08 февраля 2019

Это плохой подход?

Нет, это не так!Вы должны обязательно удалить слушателя, когда он больше не нужен.Я предполагаю, что вы добавляете слушателя в свой метод 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, чтобы опуститьданные, даже если результаты не изменились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...