2017-05-08 42 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");