我正在尝试用一个事件侦听器来实现一个来自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实时数据库数据在后台时,应用程序关闭。
发布于 2018-10-07 22:42:03
您需要阻止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是否应该重新尝试完成的工作。
发布于 2018-10-03 15:39:21
正如我所看到的,您正在使用addListenerForSingleValueEvent(),这意味着侦听器将精确地读取数据一次。这意味着您的onDataChange()方法将被当前值触发(如果可用,则从缓存触发,否则从Firebase服务器触发),然后立即停止侦听。在这种情况下,不需要删除侦听器。唯一需要取消addListenerForSingleValueEvent的时间是当您将其附加到网络连接并且客户端没有数据的本地副本时,因为有另一个活动的侦听器,或者因为它有磁盘上的数据副本。
如果您想继续侦听更改,则应该使用addValueEventListener()。使用这种侦听器意味着您的onDataChange()方法将立即与当前数据一起调用,但是(与addListenerForSingleValueEvent不同)侦听器将在此之后保持活动状态,您的onDataChange()也将被调用以进行以后的更改。
您可以在关闭安卓应用程序后使用addValueEventListener(),方法是不删除它。通常,一旦您使用侦听器,您还需要根据活动的生命周期进行移除。如果不删除侦听器,应用程序将只工作一段时间,因为如果应用程序不在前台,Android将停止您的服务。这样做是为了在应用程序未被使用时节省资源。它也可能阻止你的应用程序做任何网络,甚至完全扼杀应用程序的进程。正如您已经提到的,除了将其作为前台服务之外,没有什么可以阻止这一点。
前台服务可能不是为您的情况做的最好的事情,也不是您的用户的最佳选择。阅读更多关于背景服务的限制的信息。
我的建议是使用防火墙云消息传递通知您的应用程序时,它可能感兴趣的变化。所以你的用户会收到通知,即使他们会保持他们的应用程序关闭。
https://stackoverflow.com/questions/52622947
复制相似问题