Android Worker中的Firebase事件监听器 [英] Firebase Event Listener inside Android Worker

查看:89
本文介绍了Android Worker中的Firebase事件监听器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从Android WorkManager实施带有用于Firebase数据库参考的事件侦听器的Worker.如果应用程序位于前景/背景中,则效果很好.但是,一旦我关闭该应用程序并且工作程序运行,事件监听器就不会触发,据我所知,我在日志中没有收到与此相关的任何错误消息.

I am trying to implement a Worker from Android WorkManager with an Event listener for Firebase database reference. It works fine if the app is in foreground/background. But once I close the app and the worker runs the event listener is not triggering, As far as I can tell I am not getting any error messages related to this in log.

这是示例代码:

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实时数据库数据.

Please let me know if there is anything I can do to get and handle Firebase realtime database data in background when app is closed.

推荐答案

您需要阻止 doWork()的执行,直到完成所有工作为止.现在,由于 addListenerForSingleValueEvent 是异步的,因此您的函数将立即返回 SUCCESS ,这意味着WorkManager假定一切都已完成,并允许您的应用进程停止.

You need to block execution of doWork() until all the work is complete. Right now, since addListenerForSingleValueEvent is asynchronous, your function is returning SUCCESS immediately, which means that WorkManager assumes that everything is done and allows your app process to stop.

一种阻塞功能的方法是使用CountDownLatch强制代码等待侦听器完成:

One way to get your function to block is to use a CountDownLatch to force your code to wait until the listener is complete:

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是否应重试已完成的工作.

You may also want to consider when to return a different result code in order to tell WorkManager if your work completed should retried or not.

这篇关于Android Worker中的Firebase事件监听器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆