在Android中使用okhttp3与服务器建立WebSocket非常简单,用下面的代码就能够建立:
Request request = new Request.Builder()
.url(url)
.header(Requests.TOKEN_KEY, token)
.build();
ChatWebSocketListener listener = new ChatWebSocketListener();
WebSocket webSocket = client.newWebSocket(request, listener);
但是最后一步newWebSocket
这个方法是异步的,不管连接成功与否都会直接先返回一个WebSocket对象。有时后面的处理需要连接结果,也就是阻塞处理,下面是一个解决方式。
public static WebSocket websocket(String url, String token, ChatActivity activity) {
Request request = new Request.Builder()
.url(url)
.header(Requests.TOKEN_KEY, token)
.build();
ChatWebSocketListener listener = new ChatWebSocketListener();
// 在即将进行成功连接后监听的自定义的WebSocketListener中
// 记录尝试建立连接的线程
listener.setWaitingThread(Thread.currentThread(), activity);
WebSocket webSocket = client.newWebSocket(request, listener);
// 在这里线程挂起等待连接结果
// 网络请求在安卓中都是异步非主线程,可以阻塞
LockSupport.park();
if (listener.connected()) {
return webSocket;
}
return null;
}
ChatWebSocketListener中:
public void setWaitingThread(Thread waitingThread, ChatActivity activity) {
this.waitingThread = waitingThread;
this.activity = activity;
this.adapter = activity.adapter;
}
在onOpen方法中进行线程恢复处理:
@Override
public void onOpen(@NonNull WebSocket webSocket, @NonNull Response response) {
this.connected = true;
if (waitingThread != null) {
// 即使这一步先于park,依然有效
LockSupport.unpark(waitingThread);
}
waitingThread = null;
}