在过去的几天里,我一直在尝试显示用户的在线/离线状态。为此,我有一个注册活动,他们在其中注册,他们的信息会保存在 firebase 中,如果他们退出活动,我会覆盖其 onstop方法并将值设置为离线...但是如果用户突然失去互联网连接,它仍然显示在线..我无法将其更改为离线,因为需要互联网来在数据库中进行更改,并且使用没有互联网...那么我如何将数据库值设置为离线...我用谷歌搜索了很多关于此的内容,但没有找到任何内容...任何人都可以帮我吗
My code
@Override
protected void onStart() {
super.onStart();
fetchData();
// mDatabaseReference.child("UserData").child(UID).child("Online").setValue("True");
}
@Override
protected void onStop() {
super.onStop();
fetchData();
// mDatabaseReference.child("UserData").child(UID).child("Online").setValue(false);
}
您正在尝试做的事情被称为存在系统。 Firebase 数据库有一个特殊的 API 可以实现此目的:onDisconnect()
。当您将处理程序附加到onDisconnect()
,当服务器检测到客户端已断开连接时,将在服务器上执行您指定的写入操作。
来自有关管理存在的文档 https://firebase.google.com/docs/database/android/offline-capabilities#section-presence:
这是一个在断开连接时写入数据的简单示例,方法是使用onDisconnect
原始:
DatabaseRef presenceRef = FirebaseDatabase.getInstance().getReference("disconnectmessage");
// Write a string when this client loses connection
presenceRef.onDisconnect().setValue("I disconnected!");
对于您的情况,这可能很简单:
protected void onStart() {
super.onStart();
fetchData();
DatabaseReference onlineRef = mDatabaseReference.child("UserData").child(UID).child("Online");
onlineRef.setValue("True");
onlineRef.onDisconnect().setValue("False");
}
请注意,这将在简单的情况下起作用,但会开始出现问题,例如当您的连接快速切换时。在这种情况下,服务器可能需要比客户端重新连接所需的时间更长的时间才能检测到客户端消失(因为这可能取决于套接字超时),从而导致无效False
.
为了更好地处理这些情况,请查看文档中的示例存在系统 https://firebase.google.com/docs/database/android/offline-capabilities#section-sample,它对边缘情况有更精细的处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)