Прослушиватель событий Firebase внутри Android Worker - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь реализовать Worker из Android WorkManager с помощью прослушивателя событий для ссылки на базу данных Firebase.Это работает нормально, если приложение находится на переднем плане / фона.Но как только я закрываю приложение и рабочий запускает, прослушиватель событий не запускается, насколько я могу судить, я не получаю никаких сообщений об ошибках, связанных с этим, в журнале.

Вот пример кода:

class FirebaseWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
    val firebaseDatabaseRef = FirebaseDatabase.getInstance().reference
    firebaseDatabaseRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            // Handle DataSnapshot
        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Handle DatabaseError
        }
    })

    return Result.SUCCESS
  }
}

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

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вам нужно заблокировать выполнение doWork(), пока вся работа не будет завершена.Прямо сейчас, поскольку addListenerForSingleValueEvent является асинхронным, ваша функция немедленно возвращает SUCCESS, что означает, что WorkManager предполагает, что все сделано, и позволяет вашему приложению остановиться.

Один из способов заставить вашу функцию блокироватьсяиспользовать CountDownLatch, чтобы заставить ваш код ждать завершения слушателя:

override fun doWork(): Result {
    val latch = CountDownLatch(1)
    val firebaseDatabaseRef = FirebaseDatabase.getInstance().reference
    firebaseDatabaseRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            // Handle DataSnapshot
            latch.countDown()
        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Handle DatabaseError
            latch.countDown()
        }
    })

    latch.await()
    return Result.SUCCESS
}

Вы также можете подумать, когда следует возвращать другой код результата, чтобы сообщить WorkManager, что ваша работа должна быть повторена.или нет.

0 голосов
/ 03 октября 2018

Как я вижу, вы используете addListenerForSingleValueEvent(), что означает, что слушатель будет читать данные точно один раз.Это означает, что ваш метод onDataChange() запускается с текущим значением (из кэша, если доступно, в противном случае с серверов Firebase), и сразу после этого прекращает прослушивание.В этом случае нет необходимости удалять слушателя.Единственное время, когда addListenerForSingleValueEvent необходимо отменить, - это когда нет сетевого подключения, когда вы подключаете его, и у клиента нет локальной копии данных, либо потому, что был другой активный слушатель, либо потому, что у него есть копияданные на диске.

Если вы хотите продолжать прослушивать изменения, вы должны использовать addValueEventListener().Использование такого типа слушателя означает, что ваш onDataChange() метод вызывается немедленно с текущими данными, но (в отличие от addListenerForSingleValueEvent) слушатель останется активным после этого, и ваш onDataChange() будет также вызван для последующих изменений.

Вы можете использовать addValueEventListener() после закрытия приложения Android, не удаляя его.Обычно, когда вы используете слушателя, вам также необходимо удалить его в соответствии с жизненным циклом действия.Если не удалить слушателя, приложение будет работать только в течение определенного периода времени, потому что Android остановит ваш сервис, если приложение не на переднем плане.Это позволяет экономить ресурсы, когда приложение не используется.Это также может помешать вашему приложению работать в сети или даже полностью убить процесс приложения.Вы ничего не можете сделать, чтобы предотвратить это, кроме как сделать его службой переднего плана, как вы уже упоминали.

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

Я рекомендую использовать Firebase Cloud Messaging , чтобы уведомлять ваше приложение о том, что что-то изменилось и может заинтересовать его.Ваши пользователи будут получать уведомления, даже если они будут держать свое приложение закрытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...