[英]Firebase Event Listener inside Android Worker
我正在嘗試使用Android WorkManager實現一個Worker,其中包含一個用於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實時數據庫數據。
您需要阻止執行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您的工作是否應該重試。
正如我所看到的,您正在使用addListenerForSingleValueEvent()
,這意味着偵聽器將精確讀取一次數據。 這意味着你的onDataChange()
方法會被當前值觸發(如果可用,則來自緩存,否則來自Firebase服務器),並在此之后立即停止偵聽。 在這種情況下,不需要刪除監聽器。 addListenerForSingleValueEvent
需要被取消的唯一時間是,如果在連接它時沒有網絡連接,並且客戶端沒有數據的本地副本,要么是因為有另一個活動偵聽器,要么是因為它有一個數據副本磁盤。
如果要繼續偵聽更改,則應使用addValueEventListener()
。 使用這種類型的偵聽器意味着使用當前數據立即調用onDataChange()
方法,但是(與addListenerForSingleValueEvent
不同)偵聽器將在此之后保持活動狀態,並且還將調用onDataChange()
以用於以后的更改。
關閉Android應用程序后,可以使用addValueEventListener()
,方法是不刪除它。 通常,一旦使用了監聽器,您還需要根據活動的生命周期將其刪除 。 如果不刪除監聽器,該應用程序將僅在一段時間內工作,因為如果應用程序不在前台,Android將停止您的服務。 這樣做是為了在不使用應用程序時節省資源。 它還可能阻止您的應用程序進行任何聯網,甚至完全終止應用程序進程。 除了將其作為前台服務之外,您無法做任何事情來阻止這種情況,正如您已經提到的那樣。
前台服務可能不是您的最佳選擇,對您的用戶來說也不是最好的選擇。 閱讀有關后台服務限制的更多信息。
我的建議是使用Firebase Cloud Messaging在可能感興趣的內容發生變化時通知您的應用。因此,即使用戶關閉應用,您的用戶也會收到通知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.