Java Firebase实时数据库:如何使用onDisconnect

Java Firebase实时数据库:如何使用onDisconnect,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我发现当用户使用onDisconnect关闭应用程序时,我可以处理,但它并没有像我预期的那样工作 我想做的只是在用户关闭设备或关闭应用程序时删除一个节点。但即使关闭模拟器,数据库也从未改变 mBaseNode = FirebaseDatabase.getInstance().getReference().child(...); mBaseNode.child("aValue").onDisconnect.removeValue(); mBaseNode.addValueEventListener

我发现当用户使用
onDisconnect
关闭应用程序时,我可以处理,但它并没有像我预期的那样工作

我想做的只是在用户关闭设备或关闭应用程序时删除一个节点。但即使关闭模拟器,数据库也从未改变

mBaseNode = FirebaseDatabase.getInstance().getReference().child(...);
mBaseNode.child("aValue").onDisconnect.removeValue();
mBaseNode.addValueEventListener()...

我可能会误解有关断开连接的信息。这有什么不对?

这背后的原因是,
onDestroy()
通常根本不被调用。通常,系统只是在没有任何回调的情况下终止进程。知道何时会触发
onDestory()
,有点棘手

它主要在客户端和服务器断开连接时触发

当客户端和服务器断开连接时,可能会发生两种情况:

  • 客户端显式断开与服务器的连接
  • 客户就这样消失了
  • 当你关闭应用程序时,你触发了一个明确的断开连接。在这种情况下,客户端将向服务器发送一个正在断开连接的信号,服务器将立即执行
    onDisconnect()
    回调

    当你关闭wifi时,你的应用程序没有机会告诉服务器它正在断开连接。在这种情况下,
    onDisconnect()
    将在服务器检测到客户机不在时触发

    这甚至可能需要几分钟,具体取决于套接字超时的配置方式。因此,在这种情况下,你只需要多一点耐心,这意味着它在你真正的应用程序中看起来并不好

    因此,我建议您删除活动的
    onPause()
    方法中的值,如下所示:

    @覆盖
    受保护的void onPause(){
    super.onPause();
    final DatabaseReference rRef=FirebaseDatabase.getInstance().getReference().child(toBeDeleted);
    rRef.child(yourWishChild.removeValue();
    }
    
    这背后的原因是,
    onDestroy()
    通常根本不被调用。通常,系统只是在没有任何回调的情况下终止进程。知道何时会触发
    onDestory()
    ,有点棘手

    它主要在客户端和服务器断开连接时触发

    当客户端和服务器断开连接时,可能会发生两种情况:

  • 客户端显式断开与服务器的连接
  • 客户就这样消失了
  • 当你关闭应用程序时,你触发了一个明确的断开连接。在这种情况下,客户端将向服务器发送一个正在断开连接的信号,服务器将立即执行
    onDisconnect()
    回调

    当你关闭wifi时,你的应用程序没有机会告诉服务器它正在断开连接。在这种情况下,
    onDisconnect()
    将在服务器检测到客户机不在时触发

    这甚至可能需要几分钟,具体取决于套接字超时的配置方式。因此,在这种情况下,你只需要多一点耐心,这意味着它在你真正的应用程序中看起来并不好

    因此,我建议您删除活动的
    onPause()
    方法中的值,如下所示:

    @覆盖
    受保护的void onPause(){
    super.onPause();
    final DatabaseReference rRef=FirebaseDatabase.getInstance().getReference().child(toBeDeleted);
    rRef.child(yourWishChild.removeValue();
    }
    
    我认为
    onPause
    不是在用户关闭设备或关闭应用程序时发生的。
    onPause()。所以你可以在不同的活动中使用
    onPause()
    来实现你的东西。你是说完成一项活动?或者甚至开始一项新的活动?@nani两者都有,因为离开一项活动意味着完成一项活动或开始另一项活动。但是您可以在启动的新活动开始时重置所需节点的值。实际上,我不想在启动新活动时删除该节点。我只想在完成活动时执行此操作。我认为
    onPause
    发生在用户关闭设备或关闭应用程序时除外。
    onPause()
    会在用户离开特定活动时触发。所以你可以在不同的活动中使用
    onPause()
    来实现你的东西。你是说完成一项活动?或者甚至开始一项新的活动?@nani两者都有,因为离开一项活动意味着完成一项活动或开始另一项活动。但是您可以在启动的新活动开始时重置所需节点的值。实际上,我不想在启动新活动时删除该节点。我只想在活动结束时做。