Как прервать цикл из другого объекта?
Вот есть у меня цикл:
for (domain in databaseResponseLiveData.value!!) {
DomainsAPI.retrofitDomainService.getDomainDescriptionWithRetrofit())
.enqueue(object : Callback<String> {
override fun onFailure(call: Call<String>, t: Throwable) {
currentDomainLiveData.value = "ERROR"
Timber.e("failure on ${databaseResponseLiveData.value!!.indexOf(domain)} element")
Timber.e(t)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
downloadingResult[domain] = response.body()!!
currentDomainLiveData.value = domain
}
})
}
Я хочу его прервать в случае вызова функции onFailure(). То есть если ошибка, мне надо выполнить сразу код после цикла и больше ничего не загружать. Как такое можно реализовать?
Ответы (1 шт):
Автор решения: Eugene Krivenja
→ Ссылка
Хоть это и не совсем правильно, но не зная всей архитектуры приложения можно подсказать попробовать выкрутиться так:
val requests = mutableListOf<Call>()
for (domain in databaseResponseLiveData.value!!) {
val request = DomainsAPI.retrofitDomainService.getDomainDescriptionWithRetrofit())
request.enqueue(object : Callback<String> {
override fun onFailure(call: Call<String>, t: Throwable) {
currentDomainLiveData.value = "ERROR"
requests.forEach { it.cancel() }
Timber.e("failure on ${databaseResponseLiveData.value!!.indexOf(domain)} element")
Timber.e(t)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
downloadingResult[domain] = response.body()!!
currentDomainLiveData.value = domain
}
})
requests.add(request)
}
Насколько я помню, cancel() можно вызывать сколько угодно раз и в любом состоянии запроса.