【练习/Android】使用okhttp3阻塞建立WebSocket连接

在Android中使用OkHttp3建立WebSocket连接时,newWebSocket方法会立即返回,而连接状态未知。为了解决这个问题,文章提供了一个解决方案,通过自定义WebSocketListener并在onOpen方法中进行线程恢复处理,实现连接成功的阻塞等待。这样,调用方可以在获取到连接成功的确认后继续执行后续操作。
摘要由CSDN通过智能技术生成

在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;
}
使用OkHttp3实现WebSocket的步骤如下: 首先,我们需要导入OkHttp的依赖库。可以通过在项目的build.gradle文件的dependencies块中添加以下代码来实现: implementation 'com.squareup.okhttp3:okhttp:3.14.0' 接下来,我们在代码中创建一个OkHttpClient实例,并使用它来建立WebSocket连接。例如: OkHttpClient client = new OkHttpClient(); // WebSocket连接地址 String url = "ws://example.com/socket"; // 创建WebSocket请求 Request request = new Request.Builder().url(url).build(); // 建立WebSocket连接 WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { super.onOpen(webSocket, response); // 连接已经建立 Log.d("WebSocket", "连接已经建立"); } @Override public void onMessage(WebSocket webSocket, String text) { super.onMessage(webSocket, text); // 接收到消息 Log.d("WebSocket", "接收到消息:" + text); } @Override public void onClosed(WebSocket webSocket, int code, String reason) { super.onClosed(webSocket, code, reason); // 连接已关闭 Log.d("WebSocket", "连接已关闭"); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { super.onFailure(webSocket, t, response); // 连接失败 Log.d("WebSocket", "连接失败"); } }); 通过上述代码,我们使用OkHttpClient创建了一个WebSocket连接建立连接时会调用onOpen方法,接收到消息时会调用onMessage方法,连接关闭时会调用onClosed方法,连接失败时会调用onFailure方法。 我们还可以通过WebSocket对象发送消息,例如: webSocket.send("Hello, WebSocket!"); 当我们不再需要WebSocket连接时,可以通过调用webSocket.close()方法来关闭连接。 总结来说,使用OkHttp3实现WebSocket非常方便,只需要创建OkHttpClient对象,根据WebSocket的生命周期处理不同的回调方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值