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
相关产品推荐
相关产品推荐

