Кэш базы данных Firebase, вызывающий сбой приложения из-за памяти - PullRequest
0 голосов
/ 13 мая 2018

Приложение довольно простое, оно позволяет пользователям заполнять опросы, а затем отправляет их на сервер. Я включил setPersistence, поэтому он также будет работать, когда они не подключены к Интернету, и просто отправляет их на сервер, когда подключен к сети.

Это работает нормально, однако после определенного количества опросов (30-50) приложение каждый раз вылетает при запуске с ошибкой com.google.android.gms.dynamite_dynamitemodulesc. Все они сообщаются как разные ошибки из-за адреса памяти в имени. Объяснение ошибки:

Вызвано java.lang.OutOfMemoryError Не удалось выделить 202 байта с 15532496 свободными байтами и 14 МБ до OOM; ошибка из-за фрагментации (требуются свободные непрерывные 16384 байта для нового буфера, где наибольшее свободное непрерывное число составляет 12288 байтов)

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

Я искал способ очистить кэш Firebase вручную, но, насколько я вижу, это невозможно.

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

DatabaseReference session = mResults.push();

session.child("examiner").setValue(username);
session.child("place").setValue(place);
session.child("filled_by").setValue(fillingOut);
session.child("timestamp").setValue(millis);
session.child("ref_number").setValue(referenceCode);

DatabaseReference questions = session.child("questions");

for(Question q : allQuestions) {

    DatabaseReference question = questions.push();

    question.child("question").setValue(q.text);
    question.child("skipped").setValue(q.skipped);
    DatabaseReference answers = question.child("answers");

    for(Answer a : q.answers) {

        DatabaseReference answer = answers.push();

        answer.child("selected").setValue(a.selected);
        answer.child("text").setValue(a.text);
        answer.child("value").setValue(a.inputValue);
    }
}
...