2017-05-08 70 views

回答

1

基於你給不考慮性能和帶寬限制的信息,這裏是我將如何解決此問題的方法:

使用服務,並在真實的線 - 時間數據庫:

內實時數據庫,我將有一個OnlineStatus線程,然後我會保存用戶ID的子鍵 - 值對,並設置其值爲「綠色」或「黃色」或「紅」;這會給我關於用戶是在線還是離開的狀態。因此,這將是這樣的:

OnlineStatus

  • 用戶1:綠色
  • 用戶2:黃色
  • 用戶3:紅

創建服務,將檢查:

  • 該用戶已通過身份驗證
  • 該應用程序在後臺

如果用戶被認證,並且應用程序是開放的,那麼寫入到OnlineStatus線程當前用戶作爲密鑰和「綠」作爲價值。

如果應用程序在後臺並且用戶已通過身份驗證,則執行相同的操作,但「黃色」是值。

其他任何應該導致顏色「紅」。另外請注意,如果用戶註銷,您可能希望在該操作過程中寫入「紅色」。

因此,這允許每個設備更新Firebase實時數據庫。剩下的就是添加對OnlineStatus位置的引用,以通過ValueEventListener監聽更改。

希望這會有所幫助。

+0

謝謝您的回覆... –

1

Mabz看法是正確的概念,但我要強調火力地堡的特點,專門用於解決您的使用案例。

我碰到的麻煩是用'離線'狀態更新RealtimeDatabase。即,如果客戶端(例如您的Android應用程序)處於脫機狀態,它應該如何告知數據庫?

解決方案:使用DatabaseRef.onDisconnect()設置脫機狀態自動

DatabaseRef presenceRef = 
FirebaseDatabase.getInstance().getReference("disconnectmessage"); 
// Write a string when this client loses connection 
presenceRef.onDisconnect().setValue("I disconnected!"); 

From the documentation

當你建立一個onDisconnect()操作,操作住在 的火力地堡實時數據庫服務器。服務器檢查安全 確保用戶能夠執行所請求的寫事件,並通知 了您的應用程序,如果它是無效的。服務器然後監視連接。如果在任何時候連接超時,或者正在積極 通過實時數據庫客戶端關閉,服務器將檢查安全 第二次(以確保操作仍然有效),然後 調用事件。當你的應用程序第一次連接

A(略)更實際的例子可能會做這樣的事情:

DatabaseRef userStatus = 
FirebaseDatabase.getInstance().getReference("users/<user_id>/status"); 
userStatus.setValue("online"); 
userStatus.onDisconnect.setValue("offline");