You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android/Kotlin前台WebSocket连接自动重连实现方案咨询

Android/Kotlin 前台WebSocket自动重连最佳实现

首选方案:Coroutine(协程)

相比Thread,协程更轻量、语法简洁,结合Jetpack的生命周期协程作用域能完美适配Activity/Fragment的onResume/onPause状态,避免内存泄漏和手动线程管理的繁琐。

实现示例

1. 简化版WebSocket管理类

class WebSocketManager {
    private var webSocket: WebSocket? = null
    private val serverUrl = "ws://your-server-address"

    // 检查连接状态
    fun isConnected(): Boolean = webSocket?.isOpen == true

    // 初始化并建立连接
    fun connect() {
        val client = OkHttpClient()
        val request = Request.Builder().url(serverUrl).build()
        webSocket = client.newWebSocket(request, object : WebSocketListener() {
            override fun onOpen(webSocket: WebSocket, response: Response) {
                // 连接成功后的业务逻辑
            }

            override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
                this@WebSocketManager.webSocket = null
            }

            override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
                this@WebSocketManager.webSocket = null
            }
        })
    }

    // 关闭连接
    fun disconnect() {
        webSocket?.close(1000, "App paused")
        webSocket = null
    }
}

2. Activity中集成重连逻辑

class MainActivity : AppCompatActivity() {
    private val webSocketManager = WebSocketManager()
    private var reconnectJob: Job? = null

    override fun onResume() {
        super.onResume()
        // 初始化连接
        webSocketManager.connect()
        // 启动定时重连检查协程
        reconnectJob = lifecycleScope.launch(Dispatchers.IO) {
            while (isActive) {
                delay(5000) // 每5秒检查一次
                if (!webSocketManager.isConnected()) {
                    webSocketManager.connect()
                }
            }
        }
    }

    override fun onPause() {
        super.onPause()
        // 关闭WebSocket
        webSocketManager.disconnect()
        // 取消重连协程
        reconnectJob?.cancel()
        reconnectJob = null
    }
}

关键细节说明

  • lifecycleScope:Jetpack提供的与Activity生命周期绑定的协程作用域,Activity销毁时会自动取消所有关联协程,避免内存泄漏。
  • isActive:协程内置状态属性,协程被取消后会自动变为false,终止循环。
  • Dispatchers.IO:将重连、检查逻辑放在IO线程,不会阻塞主线程影响UI。

其他方案对比

  • Thread:需要手动管理线程启停、线程安全,代码冗余且易引发内存泄漏,不推荐。
  • WorkManager:适合后台持久化任务,前台重连场景用它过于重量级,没必要。

内容的提问来源于stack exchange,提问作者Boris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:33:15