Как прервать цикл из другого объекта?

Вот есть у меня цикл:

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() можно вызывать сколько угодно раз и в любом состоянии запроса.

→ Ссылка