Skip to content

Commit c463e3f

Browse files
committed
add reconnect api
1 parent 2ff1c69 commit c463e3f

File tree

4 files changed

+52
-41
lines changed

4 files changed

+52
-41
lines changed

AndroidAsync/src/com/koushikdutta/async/future/Future.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ public interface Future<T> extends Cancellable, java.util.concurrent.Future<T> {
88
* @return
99
*/
1010
public Future<T> setCallback(FutureCallback<T> callback);
11+
public <C extends TransformFuture<?, T>> C then(C callback);
1112
}

AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,13 @@ public SimpleFuture<T> setCallback(FutureCallback<T> callback) {
151151
return this;
152152
}
153153

154+
@Override
155+
public <C extends TransformFuture<?, T>> C then(C callback) {
156+
callback.setParent(this);
157+
setCallback(callback);
158+
return callback;
159+
}
160+
154161
@Override
155162
public SimpleFuture<T> setParent(Cancellable parent) {
156163
super.setParent(parent);

AndroidAsync/src/com/koushikdutta/async/http/socketio/SocketIOClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@ public void of(String endpoint, ConnectCallback connectCallback) {
174174
connection.connect(new SocketIOClient(connection, endpoint, connectCallback));
175175
}
176176

177+
public void reconnect() {
178+
connection.reconnect(null);
179+
}
180+
177181
public WebSocket getWebSocket() {
178182
return connection.webSocket;
179183
}

AndroidAsync/src/com/koushikdutta/async/http/socketio/SocketIOConnection.java

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.koushikdutta.async.callback.CompletedCallback;
88
import com.koushikdutta.async.future.Cancellable;
99
import com.koushikdutta.async.future.DependentCancellable;
10+
import com.koushikdutta.async.future.FutureCallback;
11+
import com.koushikdutta.async.future.TransformFuture;
1012
import com.koushikdutta.async.http.AsyncHttpClient;
1113
import com.koushikdutta.async.http.AsyncHttpResponse;
1214
import com.koushikdutta.async.http.WebSocket;
@@ -85,66 +87,63 @@ public void disconnect(SocketIOClient client) {
8587
webSocket = null;
8688
}
8789

90+
Cancellable connecting;
8891
void reconnect(final DependentCancellable child) {
8992
if (isConnected()) {
9093
return;
9194
}
9295

96+
// if a connection is in progress, just wait.
97+
if (connecting != null && !connecting.isDone() && !connecting.isCancelled()) {
98+
if (child != null)
99+
child.setParent(connecting);
100+
return;
101+
}
102+
93103
request.logi("Reconnecting socket.io");
94104

95105
// dont invoke onto main handler, as it is unnecessary until a session is ready or failed
96106
request.setHandler(null);
97-
// initiate a session
98-
Cancellable cancel = httpClient.executeString(request, new AsyncHttpClient.StringCallback() {
107+
108+
Cancellable connecting = httpClient.executeString(request)
109+
.then(new TransformFuture<WebSocket, String>() {
99110
@Override
100-
public void onCompleted(final Exception e, AsyncHttpResponse response, String result) {
101-
request.logi("socket.io session received");
111+
protected void transform(String result) throws Exception {
112+
String[] parts = result.split(":");
113+
String session = parts[0];
114+
if (!"".equals(parts[1]))
115+
heartbeat = Integer.parseInt(parts[1]) / 2 * 1000;
116+
else
117+
heartbeat = 0;
118+
119+
String transportsLine = parts[3];
120+
String[] transports = transportsLine.split(",");
121+
HashSet<String> set = new HashSet<String>(Arrays.asList(transports));
122+
if (!set.contains("websocket"))
123+
throw new Exception("websocket not supported");
124+
125+
final String sessionUrl = request.getUri().toString() + "websocket/" + session + "/";
126+
127+
httpClient.websocket(sessionUrl, null, null)
128+
.setCallback(getCompletionCallback());
129+
}
130+
})
131+
.setCallback(new FutureCallback<WebSocket>() {
132+
@Override
133+
public void onCompleted(Exception e, WebSocket result) {
102134
if (e != null) {
103135
reportDisconnect(e);
104136
return;
105137
}
106138

107-
try {
108-
String[] parts = result.split(":");
109-
String session = parts[0];
110-
if (!"".equals(parts[1]))
111-
heartbeat = Integer.parseInt(parts[1]) / 2 * 1000;
112-
else
113-
heartbeat = 0;
114-
115-
String transportsLine = parts[3];
116-
String[] transports = transportsLine.split(",");
117-
HashSet<String> set = new HashSet<String>(Arrays.asList(transports));
118-
if (!set.contains("websocket"))
119-
throw new Exception("websocket not supported");
120-
121-
final String sessionUrl = request.getUri().toString() + "websocket/" + session + "/";
122-
123-
Cancellable cancel = httpClient.websocket(sessionUrl, null, new AsyncHttpClient.WebSocketConnectCallback() {
124-
@Override
125-
public void onCompleted(Exception ex, WebSocket webSocket) {
126-
if (ex != null) {
127-
reportDisconnect(ex);
128-
return;
129-
}
130-
131-
reconnectDelay = 1000L;
132-
SocketIOConnection.this.webSocket = webSocket;
133-
attach();
134-
}
135-
});
136-
137-
if (child != null)
138-
child.setParent(cancel);
139-
}
140-
catch (Exception ex) {
141-
reportDisconnect(ex);
142-
}
139+
reconnectDelay = 1000L;
140+
SocketIOConnection.this.webSocket = result;
141+
attach();
143142
}
144143
});
145144

146145
if (child != null)
147-
child.setParent(cancel);
146+
child.setParent(connecting);
148147
}
149148

150149
void setupHeartbeat() {

0 commit comments

Comments
 (0)