之前的两篇关于如何使用OkHttp来实现WebSocket通信,然后有很多小伙伴私信问我如何实现断线重连,今天我就把我项目中实现的重连机制代码贴出来:
(我的实现思想就是基于斐波那契数列来进行尝试重连)
1. 抽象的接口:
interface IRetryStrategy {
fun retry(url: String)
fun reset()
}
2. 重连策略实现类:
class FibonacciRetryStrategyImpl : IRetryStrategy {
private var lastTimeInterval: Long = 0
private var currentTimeInterval: Long = 1
private var subscriber: DisposableSubscriber<Long>? = null
override fun retry(url: String) {
var retryInterval = lastTimeInterval + currentTimeInterval
lastTimeInterval = currentTimeInterval
currentTimeInterval = retryInterval
if (retryInterval > MAX_INTERVAL) {
retryInterval = MAX_INTERVAL
}
logi { "retryInterval = $retryInterval" }
subscriber?.dispose()
subscriber = Flowable.intervalRange(0, retryInterval, 0, 1, TimeUnit.SECONDS)
.subscribeWith(object : DisposableSubscriber<Long>() {
override fun onComplete() {
WsManager.getInstance().connect(url)
}
override fun onNext(t: Long?) {}
override fun onError(t: Throwable?) {}
})
}
override fun reset() {
lastTimeInterval = 0
currentTimeInterval = 1
subscriber?.dispose()
subscriber = null
}
companion object {
private const val MAX_INTERVAL = 3600L //即一个小时
}
}
代码很简单,重连策略就是间隔1s,2s,3s,5s,8s... 类似一个斐波那契数列,如果超过一个小时,就按一个小时算。因为我的项目是一个嵌入式设备,所以按照这种策略是ok的。
3. 调用:
3.1 在onFailure方法里:
retryStrategy.retry(WS_DEVICE)
3.2 在onOpen方法里:
retryStrategy.reset()
最后:大家可以根据自己项目的需求进而实现断线重连机制,我这里贴出来只是提供一种参考。