Использование 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 для вызова обеих этих функций, исключение пропало, что имеет смысл.

Другие вопросы по тегам