Использование Firestore из JobIntentService: не удалось получить эксклюзивную блокировку для автономного сохранения клиента Firestore
Всякий раз, когда я выхожу из приложения, когда у меня установлена тревога, и тревога гаснет, когда приложение "DEAD", я получаю исключение при попытке обновить поле в Firestore.
Код работает, когда приложение работает на переднем плане, поэтому я действительно понятия не имею, что происходит. В любом случае, вот код для 2 функций, которые вызываются из JobIntentService, который в свою очередь создается из BroadcastReceiver:
private val firestoreInstance: FirebaseFirestore by lazy { FirebaseFirestore.getInstance() }
fun updateTaskCompletedSessions(taskDocRefPath: String, completedSessions: Int){
val taskDocRef = firestoreInstance.document(taskDocRefPath)
taskDocRef.get().addOnSuccessListener { documentSnapshot ->
documentSnapshot.reference
.update(mapOf("completedSessions" to completedSessions))
}
}
fun updateTaskSessionProgress(taskDocRefPath: String, sessionProgress: String){
val taskDocRef = firestoreInstance.document(taskDocRefPath)
taskDocRef.get().addOnSuccessListener { documentSnapshot ->
documentSnapshot.reference
.update(mapOf("sessionProgress" to sessionProgress))
}
}
Полная ошибка выглядит следующим образом:
Не удалось получить эксклюзивную блокировку для автономного сохранения клиента Firestore.
Как правило, это означает, что вы используете Firestore из нескольких процессов в вашем приложении. Имейте в виду, что многопроцессорные приложения Android выполняют код в вашем
Application
класс во всех процессах, поэтому вам может потребоваться избежать инициализации Firestore в вашемApplication
учебный класс. Если вы намеренно используете Firestore из нескольких процессов, вы можете включить только автономное сохранение (т.е. вызовsetPersistenceEnabled(true)
в одном из них
Я буду признателен за любую помощь. Спасибо!
1 ответ
Я рад сообщить, что нашел решение! Я использовал два последовательно запускает JobIntentServices - один для completedSessions
, другой для sessionProgress
, (Плохой дизайн, я знаю...)
Когда я поиграл с ним и сделал всего ОДИН JobIntentService для вызова обеих этих функций, исключение пропало, что имеет смысл.