我想更改用户状态以显示他是否在线。我想在数据库当用户关闭应用程序时或用与服务器失去连接时将用户状态更改为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);
我执行该任务,但因为它是在客户端,如果我们想监视用户与服务器的连接,并且当连接终止时,节点应该由服务器而不是客户端更新。如何当用户失去与服务器的连接时,我们可以从服务器更改节点值吗?
答案 0 :(得分:4)
用户可以通过两种方式与Firebase数据库断开连接。
如果断开连接,您的onDisconnect
处理程序将立即触发,因此您的数据库将立即更新。
如果出现脏连接,Firebase会依赖套接字层在远程客户端消失时发出信号。这可能需要几分钟的时间。但最终服务器将检测/判断客户端已消失,并且您的onDisconnect
处理程序将触发。
数据结构中的一个小注释:您在用户和连接之间存在1:1的关系。不幸的是,情况并非如此。
onDisconnect
会将online
设置为false
,而他们可能仍会在另一台设备上连接。onDisconnect
处理程序可能会在以后为您的新连接设置online
到true
时触发。在这种情况下,您的onDisconnect
处理程序会将online
设置为false
,而用户可能已经重新连接。所有这一切都是说您不应该依赖于用户与其连接之间的1:1关系。 samples in the Firebase documentation treat connections as a collection并假设用户已连接,只要有任何&#34;连接ID&#34; (由push()
生成)留给该用户。我建议你这样做,以防止难以调试竞争条件和连接问题。