Есть ли лучший и более простой способ оптимизировать обратный вызов помощника и код обработчика в kotlin?

Я использую вспомогательные классы с логикой повторения, которая используется во всем моем приложении. Мне было интересно, есть ли способ объединить классы обработчика и обратного вызова в один вместо двух разных классов, один для обратного вызова, а другой для обработчика. Вот мой код следующим образом: Retryhandler:

abstract class RetryHandler(private val totalRetries: Int = 0, private val delayMillis : Long = 0) : Handler() {

    private var retryCount: Int = 0

    fun retry(): Boolean {
        return if (retryCount++ < totalRetries) {
            if (delayMillis > 0) {
                postDelayed({ onRetry(retryCount) }, delayMillis)
            } else {
                onRetry(retryCount)
                true
            }
        } else false
    }

    abstract fun onRetry(retryCount: Int)
}

Повторить обратный вызов:

abstract class RetryableCallback(totalRetries: Int = 0, delayMillis : Long = 0)
    : RetryHandler(totalRetries, delayMillis), MyCallback {

    override fun handleTransactionCompleted() {
        if (!onCompleted()) {
            if (!retry()) {
                onFailed(null)
            }
        }
    }

    override fun handleTransactionFailed(e: MyException?) {
        if (!retry()) {
            onFailed(e)
        }
    }

    abstract fun onCompleted(): Boolean

    abstract fun onFailed(e: MyException? = null)
}

Вот как я использую их в своем коде:

   private val newCallback = object: RetryableCallback(5, 5000) {
            override fun onRetry(retryCount: Int) {
    ....}
    override fun onCompleted(): Boolean {
    }
    }

Любые идеи ?


person Community    schedule 29.11.2018    source источник
comment
Что вам особенно не нравится в использовании двух классов? Один сообщает, как вы повторяете попытку, второй использует логику родителя, чтобы повторить попытку.   -  person While True    schedule 29.11.2018
comment
Также не очень понятно, чего вы пытаетесь добиться, и что делают методы handleMobileKeysTransactionCompleted и handleTransactionFailed. Вам нужен обработчик, который выполняет некоторую логику в методе run и после определенного количества повторных попыток вызывает метод onComplete или onFailed. Это правильно?   -  person While True    schedule 29.11.2018
comment
они просто для проверки того, прошла ли транзакция или нет. Мне было интересно, могу ли я интегрировать оба в 1 класс вместо создания 2 отдельных классов или в любом случае я могу изменить его, чтобы сделать его лучше.   -  person    schedule 29.11.2018


Ответы (1)


Ну, пока я не до конца понимаю цель, скажем так:

abstract class RetriableCallbackHandler(private val totalRetries: Int = 0, private val delayMillis : Long = 0) : Handler(), MyCallback {

    private var retryCount: Int = 0

    fun retry(): Boolean {
        return if (retryCount++ < totalRetries) {
            if (delayMillis > 0) {
                postDelayed({ onRetry(retryCount) }, delayMillis)
            } else {
                onRetry(retryCount)
                true
            }
        } else false
    }

    abstract fun onRetry(retryCount: Int)

    override fun handleTransactionCompleted() {
        if (!onCompleted()) {
            if (!retry()) {
                onFailed(null)
            }
        }
    }

    override fun handleTransactionFailed(e: MyException?) {
        if (!retry()) {
            onFailed(e)
        }
    }

    abstract fun onCompleted(): Boolean

    abstract fun onFailed(e: MyException? = null)
}
person While True    schedule 29.11.2018
comment
а ты случайно не знаешь как это исправить? stackoverflow.com/questions/53511227/ - person ; 30.11.2018