38
38
private WebSocketClient webSocketClient ;
39
39
private int requestIdCount = 1 ;
40
40
private boolean userInitiatedDisconnect = false ;
41
+ private boolean hasReceivedConnected = false ;
41
42
42
43
/* package */ ParseLiveQueryClientImpl () {
43
44
this (getDefaultUri ());
@@ -89,7 +90,7 @@ public <T extends ParseObject> SubscriptionHandling<T> subscribe(ParseQuery<T> q
89
90
subscriptions .append (requestId , subscription );
90
91
91
92
// TODO: differentiate between state=CONNECTED, vs received op=connected response
92
- if (inAnyState ( WebSocketClient . State . CONNECTED )) {
93
+ if (isConnected ( )) {
93
94
sendSubscription (subscription );
94
95
} else if (userInitiatedDisconnect ) {
95
96
Log .w (LOG_TAG , "Warning: The client was explicitly disconnected! You must explicitly call .reconnect() in order to process your subscriptions." );
@@ -100,6 +101,10 @@ public <T extends ParseObject> SubscriptionHandling<T> subscribe(ParseQuery<T> q
100
101
return subscription ;
101
102
}
102
103
104
+ private boolean isConnected () {
105
+ return hasReceivedConnected && inAnyState (WebSocketClient .State .CONNECTED );
106
+ }
107
+
103
108
public void connectIfNeeded () {
104
109
switch (getWebSocketState ()) {
105
110
case CONNECTED :
@@ -151,18 +156,21 @@ public void reconnect() {
151
156
webSocketClient .close ();
152
157
}
153
158
159
+ userInitiatedDisconnect = false ;
160
+ hasReceivedConnected = false ;
154
161
webSocketClient = webSocketClientFactory .createInstance (webSocketClientCallback , uri );
155
162
webSocketClient .open ();
156
- userInitiatedDisconnect = false ;
157
163
}
158
164
159
165
@ Override
160
166
public void disconnect () {
161
167
if (webSocketClient != null ) {
162
- userInitiatedDisconnect = true ;
163
168
webSocketClient .close ();
164
169
webSocketClient = null ;
165
170
}
171
+
172
+ userInitiatedDisconnect = true ;
173
+ hasReceivedConnected = false ;
166
174
}
167
175
168
176
@ Override
@@ -220,6 +228,7 @@ private void parseMessage(String message) throws LiveQueryException {
220
228
221
229
switch (rawOperation ) {
222
230
case "connected" :
231
+ hasReceivedConnected = true ;
223
232
dispatchConnected ();
224
233
Log .v (LOG_TAG , "Connected, sending pending subscription" );
225
234
for (int i = 0 ; i < subscriptions .size (); i ++) {
@@ -371,6 +380,7 @@ private WebSocketClient.WebSocketClientCallback getWebSocketClientCallback() {
371
380
return new WebSocketClient .WebSocketClientCallback () {
372
381
@ Override
373
382
public void onOpen () {
383
+ hasReceivedConnected = false ;
374
384
Log .v (LOG_TAG , "Socket opened" );
375
385
ParseUser .getCurrentSessionTokenAsync ().onSuccessTask (new Continuation <String , Task <Void >>() {
376
386
@ Override
@@ -406,12 +416,14 @@ public Void then(Task<Void> task) {
406
416
@ Override
407
417
public void onClose () {
408
418
Log .v (LOG_TAG , "Socket onClose" );
419
+ hasReceivedConnected = false ;
409
420
dispatchDisconnected ();
410
421
}
411
422
412
423
@ Override
413
424
public void onError (Throwable exception ) {
414
425
Log .e (LOG_TAG , "Socket onError" , exception );
426
+ hasReceivedConnected = false ;
415
427
dispatchSocketError (exception );
416
428
}
417
429
0 commit comments