Каким образом можно "подождать" пока данные не придут, и только после этого возвращать значение?
В функции которая отправляет запрос и получает данные при помощи Retrofit, return отрабатывает быстрее чем приходят данные с сервера. И таким образом возвращаеться попросту пустое значение.
Вопрос: каким образом можно "подождать" и убедиться что данные успешно пришли, и только затем возвращать значение?
P.S. Я знаю что есть множество способов связанных с корутинами, AsynkTask, Callbacks и прочие. Однако какое решение в данном случае будет наилучшим?
(Приложение базируеться на паттерне MVP, в этом случае Model - это класс RetrofitHelper к которому Presenter обращаеться за данными).
class RetrofitHelper: MainContract.IWeatherModel {
private val dataList: List<String>? = null
private var dataTemp: Double? = null
private var mainData: String? = null
private var pressureData: Long? = null
private var humidityData: Long? = null
private var speedData: Double? = null
private var sunriseData: Long? = null
private var sunsetData: Long? = null
val BASE_URL = "https://api.openweathermap.org/data/2.5/"
val key = "(key)"
val units = "metric"
override fun getWeatherData(city: String): List<String>? {
val retrofitBuilder = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build()
.create(APIService::class.java)
val retrofitData = retrofitBuilder.getData(city, key, units)
retrofitData.enqueue(object : Callback<Data> {
override fun onResponse(call: Call<Data>, response: Response<Data>) {
val responseBody = response.body()!!
for (i in responseBody.weather) {
mainData = i.main
}
dataTemp = responseBody.main.temp
pressureData = responseBody.main.pressure
humidityData = responseBody.main.humidity
speedData = responseBody.wind.speed
sunriseData = responseBody.sys.sunrise
sunsetData = responseBody.sys.sunset
val dataList = listOf(
dataTemp.toString(),
mainData.toString(),
pressureData.toString(),
humidityData.toString(),
speedData.toString(),
sunriseData.toString(),
sunsetData.toString()
)
}
override fun onFailure(call: Call<Data>, t: Throwable) {
Log.d("Failure retrofit!", "$t")
}
})
return dataList
}
}