簡體   English   中英

Android Worker中的Firebase事件監聽器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM