Приложение базы данных Firebase в режиме реального времени зависает, когда возвращается в режим онлайн после выполнения многих операций в автономном режиме - PullRequest
0 голосов
/ 28 ноября 2018

Мое приложение использует базу данных Firebase в реальном времени, и я установил setPersistenceEnabled (true), чтобы оно продолжало работать, когда устройство отключается.Когда устройство не подключено, все в порядке, все операции, такие как добавление, изменение и удаление данных, могут работать нормально.

Проблема возникает, когда устройство возвращается в режим онлайн после выполнения слишком большого количества операций, например, удаление большого количества данных в автономном режиме.После того, как я вижу, что много данных в моей базе данных реального времени было удалено одновременно, я не могу выполнять операции, такие как добавление и изменение данных, несколько раз (5-10 минут), и это зависит от того, сколько данных я удалил в автономном режиме.Я могу видеть только мою операцию добавления и изменения после этого времени.

Мой вопрос заключается в том, сколько операций Firebase может обрабатывать в автономном режиме и делать все еще плавными, когда он возвращается в оперативный режим, поэтому мое приложение несколько раз не зависало.когда пользователь добавляет и изменяет другие данные? или

есть ли способ сделать это плавным при переходе из автономного режима в онлайн, когда у меня много операций в автономном режиме?

ниже мойкод для обновления моих данных перед их удалением, и в автономном режиме мое приложение может запускать этот блок кода до 100 раз, например, за 1 час:

public void ritase(String number){                                       
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/vehicles/").child(number);

    HashMap<String, Object> childUpdates = new HashMap<String, Object>();
    childUpdates.put("ritase/from", from);
    childUpdates.put("ritase/to", to);
    childUpdates.put("ritase/accept", accept);
    childUpdates.put("ritase/userid", userid);
    childUpdates.put("ritase/passenger", passenger);
    childUpdates.put("ritase/stat", 1);
    childUpdates.put("ritase/time_out", time);
    childUpdates.put("trips/content/time_out", time);
    childUpdates.put("trips/content/stat", 1);

    ref.updateChildren(childUpdates);
    ref.removeValue();                                                      
}

и после того, как мое приложение снова перейдет в оперативный режим, под блокомкода работа зависла на несколько минут.Застрял здесь означает, что я не могу видеть изменения немедленно в моем приложении:

Public void updateStatus(String number){                                   
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/vehicles/").child(number); 
    HashMap<String, Object> childUpdates = new HashMap<String, Object>();
    childUpdates.put("driver/name", name);
    childUpdates.put("driver/nip", nip);

    if (PrefHelper.getPref(context,VarConstant.ISBARCODE) == "true") {
        childUpdates.put("is_barcode", 1);
    } else {
        childUpdates.put("is_barcode", 0);
    }

    childUpdates.put("position/content/location", location);
    childUpdates.put("position/content/time_in", time);
    childUpdates.put("position/content/time_out", 0);
    childUpdates.put("position/content/stat", 0);
    childUpdates.put("position/content/username", username);

    int status;

    if (PrefHelper.getPref(context, VarConstant.TYPE).contains(VarConstant.PERIMETER)) {
        status = 0;
        childUpdates.put("trips/content/status", status);
        childUpdates.put("trips/content/time_start", 0);
        childUpdates.put("trips/content/time_stop", 0);
    } else {
        status = 2;
        childUpdates.put("trips/content/status", status);
        childUpdates.put("trips/content/time_start", time);
        childUpdates.put("trips/content/time_stop", time);
    }

    ref.updateChildren(childUpdates);                                       

}

Я также пытаюсь использовать обработчик завершения для removeValue (), но он срабатывает очень поздно даже в реальном времени в firebaseБаза данных, данные были удалены.

1 Ответ

0 голосов
/ 30 ноября 2018

Когда вы используете постоянство диска, Firebase сохраняет два типа данных на диске:

  1. Кэш недавно прочитанных данных.
  2. Очередь ожидающих записей.

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

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

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

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

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