使用OkHttp实现WebSocket通信之:断线重连

之前的两篇关于如何使用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()

最后:大家可以根据自己项目的需求进而实现断线重连机制,我这里贴出来只是提供一种参考。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值