2015-09-22 46 views
5

我正在使用適用於Android的Firebase作爲我們應用的聊天組件。 我很難弄清楚如何在每個聊天消息上可靠地實現狀態更新。 例如,當聊天正在與服務器同步並在同步後獲得成功反饋時顯示「正在發送..」。Firebase Android - 如何判斷節點是否已同步

我有一個onChildAdded監聽器,它將消息提供給我的適配器。但是,當每個節點添加到本地時,會立即觸發此偵聽器,並且我無法檢查每個節點的狀態

我當前的解決方案是保留一組節點密鑰,並且每次將某些內容推送到Firebase時添加密鑰。然後在setValue回調中,我從集合中刪除節點密鑰。然而,這是非常不可靠的,因爲節點可以在呼叫活動被破壞時同步等。

我想知道是否有更簡單的方法來檢查每個節點是否已經同步到服務器?

謝謝!

+1

我下面回答,但下一次請添加最少的代碼來重現問題你的問題。代碼比代碼描述更容易解析。請參閱http://stackoverflow.com/help/mcve –

回答

6

Firebase documentation on writing data

如果你想知道當你的數據發生了,你可以添加一個完成監聽器。 setValue()和updateChildren()都帶有一個可選的完成監聽器,當寫入已經提交給數據庫時會被調用。

有了這個方便的代碼示例:

ref.setValue("I'm writing data", new Firebase.CompletionListener() { 
    @Override 
    public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
     if (firebaseError != null) { 
      System.out.println("Data could not be saved. " + firebaseError.getMessage()); 
     } else { 
      System.out.println("Data saved successfully."); 
     } 
    } 
}); 
+1

是的,這是目前我使用的方法。但是在沒有網絡的情況下,那麼這個監聽器根本就不會被調用,因爲在打開網絡時數據會被排隊寫入。同時,包含此回調的活動將被銷燬。然後,我打開網絡,寫入完成。然後我回到活動。此時數據同步,但回調從未被觸發。 – recipherus

+0

爲了說明,數據在用戶關閉活動時在後臺同步。因此,永遠不會收到此回調 – recipherus

+1

在應用程序的同一個會話中,偵聽器通常仍然會被調用。如果您使用磁盤持久性並重新啓動應用程序,則偵聽程序確實無法在重新啓動後繼續存在。 –

相關問題