Вы можете дать своей функции параметр обратного вызова, который вызывается при получении ответа. И у вас не должно быть списка ввода в этом случае, потому что, если у вас есть несколько источников, изменяющих его в непредсказуемые моменты в будущем, его будет сложно отслеживать.
Функция может выглядеть так:
private fun getCurrencyModels(callback: (ArrayList<CurrencyModel>) {
val request = Request.Builder().url(BASE_URL_YESTERDAY).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
val body = response.body?.string()
val data = Gson().fromJson(body, Currencies::class.java)
val list = arrayListOf(
CurrencyModel("USD", data.rates.USD, 0.0)),
CurrencyModel("SEK", data.rates.SEK, 0.0)),
CurrencyModel("EUR", data.rates.EUR, 0.0))
)
callback(list)
}
})
}
А затем использовать его:
getCurrencyModels { modelsList ->
// do something with modelsList when it arrives
}
Альтернативой является использование сопрограмм, которые позволяют выполнять асинхронные действия без обратных вызовов. Кто-то уже создал библиотеку, которая позволяет использовать запросы OkHttp в сопрограммах , здесь . Вы можете написать свою функцию как функцию приостановки, например:
private suspend fun getCurrencyModels(): ArrayList<CurrencyModel> {
val request = Request.Builder().url(BASE_URL_YESTERDAY).build()
val client = OkHttpClient()
val response = client.newCall(request).await()
val body = response.body?.string()
val data = Gson().fromJson(body, Currencies::class.java)
return arrayListOf(
CurrencyModel("USD", data.rates.USD, 0.0)),
CurrencyModel("SEK", data.rates.SEK, 0.0)),
CurrencyModel("EUR", data.rates.EUR, 0.0))
)
}
, а затем использовать ее так:
lifecycleScope.launch {
try {
val currencyModels = getCurrencyModels()
// do something with currencyModels
} catch (e: IOException) {
// request failed
}
}
Сопрограммы позволяют очень легко избежать утечки памяти при асинхронных вызовах пережить свою активность или фрагмент. В этом случае, если ваша Activity закрывается во время обработки запроса, она будет автоматически отменена, а ссылки на вашу Activity будут удалены, чтобы сборщик мусора мог освободить вашу Activity.