Приложение довольно простое, оно позволяет пользователям заполнять опросы, а затем отправляет их на сервер. Я включил 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);
}
}