onDisconnect可防止连接自动关闭,即使已取消



文档状态"在安卓系统上,Firebase会自动管理连接状态,以减少带宽和电池使用量。当客户端没有活动侦听器、没有挂起的写操作或onDisconnect操作时。。。,Firebase在处于非活动状态60秒后关闭连接">

我假设,一旦我在onDisconnect上取消,就不需要保持连接
但是,一旦我使用onDisconnect,即使我稍后取消它,连接也永远不会关闭
如果没有onDisconnect,连接将按预期在大约1分钟内关闭

为了缩小问题范围,我做了以下片段:

DatabaseReference someDbRef = FirebaseDatabase.getInstance().getReference("somePath") ; 
someDbRef.setValue("noProblemTillHere"); // if I return immediately after this line, connection closes after ~ 1 minute
OnDisconnect onDisconnectRef = someDbRef.onDisconnect();
onDisconnectRef.setValue("abraKaDabra");
onDisconnectRef.cancel();// After this the connection is never closed. it keeps sending keepalive

不确定我在这里缺少了什么-不认为我需要自己管理底层的websocket或持久连接

日志:创建并取消了OnDisconnect引用。连接从不关闭

2022-03-28 20:19:21.589 7486-7535/com.sw... D/RepoOperation: set: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1
2022-03-28 20:19:21.589 7486-7535/com.sw... D/DataOperation: set: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1 noProblemTillHere
2022-03-28 20:19:21.591 7486-7535/com.sw... D/Connection: conn_0 - Sending data: {t=d, d={a=p, r=3, b={p=Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1, d=noProblemTillHere}}}
2022-03-28 20:19:21.592 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 40005 
2022-03-28 20:19:21.597 7486-7535/com.sw... D/RepoOperation: Aborting transactions for path: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1. Affected: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1
2022-03-28 20:19:21.598 7486-7535/com.sw... D/Connection: conn_0 - Sending data: {t=d, d={a=o, r=4, b={p=Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1, d=abraKaDabra}}} 
2022-03-28 20:19:21.598 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 44994 
2022-03-28 20:19:21.599 7486-7535/com.sw... D/Connection: conn_0 - Sending data: {t=d, d={a=oc, r=5, b={p=Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1, d=null}}}
2022-03-28 20:19:21.599 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 44998 
2022-03-28 20:19:21.653 7486-7595/com.sw... D/WebSocket: ws_0 - ws message: {"t":"d","d":{"r":3,"b":{"s":"ok","d":""}}}
2022-03-28 20:19:21.654 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 44945 
2022-03-28 20:19:21.654 7486-7535/com.sw... D/WebSocket: ws_0 - HandleNewFrameCount: 1
2022-03-28 20:19:21.655 7486-7535/com.sw... D/WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=3, b={d=, s=ok}}}
2022-03-28 20:19:21.655 7486-7535/com.sw... D/Connection: conn_0 - received data message: {r=3, b={d=, s=ok}}
2022-03-28 20:19:21.655 7486-7535/com.sw... D/PersistentConnection: pc_0 - p response: {d=, s=ok}
2022-03-28 20:19:21.665 7486-7595/com.sw... D/WebSocket: ws_0 - ws message: {"t":"d","d":{"r":4,"b":{"s":"ok","d":""}}}
2022-03-28 20:19:21.666 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 44988 
2022-03-28 20:19:21.666 7486-7595/com.sw... D/WebSocket: ws_0 - ws message: {"t":"d","d":{"r":5,"b":{"s":"ok","d":""}}}
2022-03-28 20:19:21.666 7486-7535/com.sw... D/WebSocket: ws_0 - HandleNewFrameCount: 1
2022-03-28 20:19:21.667 7486-7535/com.sw... D/WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=4, b={d=, s=ok}}}
2022-03-28 20:19:21.667 7486-7535/com.sw... D/Connection: conn_0 - received data message: {r=4, b={d=, s=ok}}
2022-03-28 20:19:21.667 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 44999 
2022-03-28 20:19:21.667 7486-7535/com.sw... D/WebSocket: ws_0 - HandleNewFrameCount: 1
2022-03-28 20:19:21.667 7486-7535/com.sw... D/WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=5, b={d=, s=ok}}}
2022-03-28 20:19:21.667 7486-7535/com.sw... D/Connection: conn_0 - received data message: {r=5, b={d=, s=ok}}
2022-03-28 20:20:06.668 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 0
2022-03-28 20:20:51.672 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: -3
2022-03-28 20:21:36.676 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: -2
2022-03-28 20:22:21.679 7486-7535/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: -2

如果我使用下面的代码片段,那么连接将在大约1分钟后自动关闭。

DatabaseReference someDbRef = FirebaseDatabase.getInstance().getReference("somePath") ; 
someDbRef.setValue("noProblemTillHere"); 
//OnDisconnect onDisconnectRef = someDbRef.onDisconnect();
//onDisconnectRef.setValue("abraKaDabra");
//onDisconnectRef.cancel();

日志:未创建OnDisconnect引用时,连接自动关闭。(如预期(

2022-03-28 20:16:28.169 7296-7350/com.sw... D/RepoOperation: set: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1
2022-03-28 20:16:28.170 7296-7350/com.sw... D/DataOperation: set: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1 noProblemTillHere
2022-03-28 20:16:28.175 7296-7350/com.sw... D/Connection: conn_0 - Sending data: {t=d, d={a=p, r=3, b={p=Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1, d=noProblemTillHere}}}
2022-03-28 20:16:28.176 7296-7350/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 37864 
2022-03-28 20:16:28.197 7296-7350/com.sw... D/RepoOperation: Aborting transactions for path: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1. Affected: /Games/games/vRYkQQs5LpSCjDxzXMP1Qvmndog1
2022-03-28 20:16:28.262 7296-7409/com.sw... D/WebSocket: ws_0 - ws message: {"t":"d","d":{"r":3,"b":{"s":"ok","d":""}}}
2022-03-28 20:16:28.263 7296-7350/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: 44913 
2022-03-28 20:16:28.263 7296-7350/com.sw... D/WebSocket: ws_0 - HandleNewFrameCount: 1
2022-03-28 20:16:28.264 7296-7350/com.sw... D/WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=3, b={d=, s=ok}}}
2022-03-28 20:16:28.265 7296-7350/com.sw... D/Connection: conn_0 - received data message: {r=3, b={d=, s=ok}}
2022-03-28 20:16:28.265 7296-7350/com.sw... D/PersistentConnection: pc_0 - p response: {d=, s=ok}
2022-03-28 20:17:13.265 7296-7350/com.sw... D/WebSocket: ws_0 - Reset keepAlive. Remaining: -1
2022-03-28 20:17:28.271 7296-7350/com.sw... D/PersistentConnection: pc_0 - Connection interrupted for: connection_idle
2022-03-28 20:17:28.273 7296-7350/com.sw... D/Connection: conn_0 - closing realtime connection
2022-03-28 20:17:28.273 7296-7350/com.sw... D/WebSocket: ws_0 - websocket is being closed
2022-03-28 20:17:28.275 7296-7350/com.sw... D/PersistentConnection: pc_0 - Got on disconnect due to OTHER
2022-03-28 20:17:28.329 7296-7350/com.sw... D/WebSocket: ws_0 - closed

编辑用最少的代码再现了该问题。https://gist.github.com/amjaingzb/9bd83653f96d4dcfbc7dab5c25558f59

此外,正如上面的要点中提到的,goOffline((和goOnline((似乎也存在种族条件。

onDisconnect处理程序在服务器上注册,而不是在客户端上。

从客户端取消onDisconnect处理程序将从服务器中删除该注册。除了重新启动非活动计时器外,它不会更改客户端的连接管理。

最新更新