Я конвертировал одно из своих приложений в новый Firestore. Я делаю что-то вроде сохранения документа нажатием кнопки, а затем в прослушивателе onSuccess
, переходя к другому действию.
Я также использую тот факт, что операции сохранения Firestore возвращают задачи, группируя задачи вместе с помощью Tasks.whenAll
:
val allTasks = Tasks.whenAll(
createSupporter(supporter),,
setStreetLookup(makeStreetKey(supporter.street_name)),
updateCircleChartForUser(statusChange, createMode = true),
updateStatusCountForUser(statusChange))
allTasks.addOnSuccessListener([email protected], successListener)
allTasks.addOnFailureListener([email protected], onFailureListener)
Наконец, я получаю идентификатор документа из успешного сохранения и сохраняю его в настройках или в локальной базе данных для последующего использования (внутри onSuccessListener
)
Все это прекрасно работает. До тех пор, пока не произойдет потеря сетевого подключения. Затем все разваливается, потому что задачи никогда не завершаются, и слушатели onSuccess/onFailure/onComplete никогда не получат вызов. Поэтому приложение просто зависает.
Я работаю над этим, проверяя наличие сети перед каждым сохранением, а затем выполняю работу, создавая задачи без каких-либо слушателей. Я также создаю идентификатор документа локально, используя генератор UUID.
Это, BTW, было не тем, как приложение работало со старой firebase. В этом случае все было хорошо в автономном режиме, и я видел, как документы синхронизировались всякий раз, когда приложение приходилось в сети.
Мое обходное решение для Firestore кажется ужасным взломом. Кто-нибудь придумал лучшее решение?
См. связанную базу данных Firestore по обратным вызовам вставки/удаления документа, которые не вызываются при отсутствии подключения addOnCompleteListener не вызывается в автономном режиме с облачным firestore