如何使用Firebase制作用户在线状态机制?

Mas*_*ood 2 android firebase firebase-realtime-database

我想更改用户状态以显示他是否在线。当用户关闭应用程序或他与服务器失去连接时,我想在数据库中将用户状态更改为false 。 在此处输入图片说明

作为名为onDisconnect()的方法,我已经使用该方法通过使用以下代码更新用户状态


HashMap<String,Object>   user_online_status=new HashMap<String,Object>(); 
user_online_status.put("online",true); 
DatabaseReference firebaseDatabase=FirebaseDatabase.getInstance().getReference().child("Users").child(userId);  

  firebaseDatabase.updateChildren(user_online_status); 
  //then to show  user offline 
  user_online_status.put("online",false);
  firebaseDatabase.onDisconnect().updateChildren(user_online_status); 
Run Code Online (Sandbox Code Playgroud)

我执行该任务,但是它是在客户端,如果我们要监视与服务器的用户连接以及连接终止时,应由服务器而不是客户端来更新节点。当用户断开与服务器的连接时,如何更改服务器的节点值?

Fra*_*len 6

用户可以通过两种方式与Firebase数据库断开连接。

  1. 干净的断开连接,客户端在断开连接之前向服务器发送信号。
  2. 肮脏的(由于缺乏更好的术语)断开连接,即在客户端可以发送信号之前关闭连接。

在彻底断开连接的情况下,您的onDisconnect处理程序将立即触发,因此您的数据库将立即更新。

在断开连接很脏的情况下,Firebase依赖套接字层在远程客户端消失时发出信号。这可能需要几分钟的时间。但是最终,服务器将检测/确定客户端已消失,并且onDisconnect处理程序触发。


数据结构中的一个小注释:用户与连接之间存在1:1的关系。不幸的是,事实并非如此。

  • 可以从多个设备连接用户。如果它们现在与这些设备之一断开连接,onDisconnect则从该设备的设置将设置onlinefalse它们仍然可以连接到另一设备上。
  • 移动设备/网络习惯于偶尔断开/重新连接。这意味着即使在单个设备上,您也可能具有多个连接。在一个肮脏的断开的情况下,该onDisconnect处理器可以很久以后解雇,当你已经设置onlinetrue新的连接。在这种情况下,挥之不去的onDisconnect处理程序将设置onlinefalse用户可能已经重新连接时的状态。

这就是说,您不应依赖于用户与其连接之间的1:1关系。Firebase文档中示例将连接视为一个集合,并假定只要该用户push()剩下任何“连接ID”(由生成),便已连接该用户。我建议您执行同样的操作,以防止难以调试竞争条件和连接问题。

  • 这正是onDisconnect处理程序所做的。服务器可能要花几分钟才能检测到客户端已消失。 (3认同)