Kotlin, как можно повторить запрос при получении ошибки при нажатии на кнопку диалога
Давайте представим ситуацию на Kotlin, когда мы пытаемся получить запрос, но не имеем подключения к Интернету, и мы получаем ошибку, затем показать AlertDialog, и нам нужно повторить запрос, если пользователь нажмет "положительную кнопку".
Этот метод проверки существующего пользователя по номеру телефона:
override fun checkPhone(phone: String, context: Context) {
view?.let {
it.showOrHideProgressBar(true)
apiManager.checkPhone(phone)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe({ result ->
view?.showOrHideProgressBar(false)
if (result.user_exists) {
view?.showLogin()
} else {
val code = result.confirmation_code
confirmPhone(phone, code, context)
}
}, { error ->
handleAnyError(error, context)
}).addToCompositeDisposable(compositeDisposable)
}
}
А вот распространенный метод обработки ошибок:
private fun handleAnyError(it: Throwable, context: Context) {
view?.showOrHideProgressBar(false)
when (it) {
is SocketTimeoutException -> showDialogWithException(context)
is UnknownHostException -> showDialogWithException(context)
else -> {
if (it.message.equals(MESS_429)) {
view?.showAnyError(context.getString(R.string.err_429))
} else if (it.message.equals(MESS_422)) {
view?.showAnyError(context.getString(R.string.err_422))
}
}
}
}
Наконец, метод для отображения диалога, предлагающего повторить запрос при нажатии положительной кнопки:
fun showDialogWithException(context: Context) {
if (!(context as Activity).isFinishing) {
DialogInternetUtils().showOkDialog(
context,
context.getString(R.string.no_internet_connection),
DialogInterface.OnClickListener
{ dialogInterface, i ->
dialogInterface?.dismiss()
if (i == Dialog.BUTTON_NEGATIVE) {
dialogInterface!!.dismiss()
return@OnClickListener
} else if (i == Dialog.BUTTON_POSITIVE) {
// here handle click button positive, need retry request
}
})
}
}
Пожалуйста, помогите мне закончить ручку, нажмите на положительную кнопку, чтобы повторить запрос. Я думаю, нужно обрабатывать ошибки в методах .doOnError()
или же .onErrorResumeNext()
но я застрял здесь...
1 ответ
Решение
Вы можете передать функцию, которая будет выполнена при нажатии кнопки диалога:
fun showDialogWithException(context: Context, action: () -> Unit) {
if (!(context as Activity).isFinishing) {
DialogInternetUtils().showOkDialog(
context,
context.getString(R.string.no_internet_connection),
DialogInterface.OnClickListener
{ dialogInterface, i ->
dialogInterface?.dismiss()
if (i == Dialog.BUTTON_NEGATIVE) {
dialogInterface!!.dismiss()
return@OnClickListener
} else if (i == Dialog.BUTTON_POSITIVE) {
action()
}
})
}
}
private fun handleAnyError(it: Throwable, context: Context, action: () -> Unit) {
view?.showOrHideProgressBar(false)
when (it) {
is SocketTimeoutException -> showDialogWithException(context, action)
is UnknownHostException -> showDialogWithException(context, action)
else -> {
if (it.message.equals(MESS_429)) {
view?.showAnyError(context.getString(R.string.err_429))
} else if (it.message.equals(MESS_422)) {
view?.showAnyError(context.getString(R.string.err_422))
}
}
}
}
override fun checkPhone(phone: String, context: Context) {
view?.let {
it.showOrHideProgressBar(true)
apiManager.checkPhone(phone)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe({ result ->
view?.showOrHideProgressBar(false)
if (result.user_exists) {
view?.showLogin()
} else {
val code = result.confirmation_code
confirmPhone(phone, code, context)
}
}, { error ->
handleAnyError(error, context, { checkPhone(phone, context) })
}).addToCompositeDisposable(compositeDisposable)
}
}