如果用户的互联网关闭,如何更改数据库值

时间:2018-07-14 16:35:04

标签: android firebase firebase-realtime-database

在过去的几天里,我一直在尝试显示用户的联机/脱机状态。为此,我有一个注册活动,他们在该处注册,他们的信息保存在Firebase中,如果他们退出活动,我有重写其onstop方法并将值设置为离线...但是,如果用户突然失去Internet连接,它仍然显示为在线。.我无法将其更改为离线,因为需要Internet来更改数据库,而使用却没有没有互联网...所以我该如何将数据库值设置为脱机...我在这方面搜索了很多东西,但没有找到任何东西...任何人都可以帮助我

我的代码

    @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);
}

1 个答案:

答案 0 :(得分:3)

您要尝试做的事被称为状态系统。 Firebase数据库具有一个特殊的API,可用于执行以下操作:onDisconnect()。当您将处理程序附加到onDisconnect()上时,当服务器检测到客户端已断开连接时,指定的写操作将在服务器上执行。

来自documentation on managing 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

要更好地处理这些情况,请查看sample presence system in the documentation,它对边缘情况的处理更为精细。

相关问题