Как ждать завершения асинхронных задач, прежде чем переходить к следующим строкам? - PullRequest
0 голосов
/ 06 июля 2018

Я бы хотел, чтобы мои операторы fetchJson (в цикле) завершили работу, прежде чем перейти к view.showFavouritePlaces(favouritePlaces).

Есть ли что-то, что я могу обернуть вокруг цикла for, чтобы завершить его выполнение?

private var favouritePlaces: MutableList<Place> = mutableListOf()


init {

    // Populate List
    for(index in 0 until favPlaceStrings.size) {
        fetchJson(favPlaceStrings.elementAt(index))
    }

    // Display RecyclerView with updated info
    view.showFavouritePlaces(favouritePlaces)

}

…

override fun fetchJson(placeName: String) {

    ...

    call.enqueue(object: Callback<Place> {

        override fun onFailure(call: Call<Place>?, t: Throwable?) {
            ...
        }

        override fun onResponse(call: Call<Place>?, response: Response<Place>?) {

            if(response != null && response.isSuccessful && response.body() != null) {
                val place: Place = response.body()!!

                println(place.toString())

                favouritePlaces.add(place)
            }
    }
})

}

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Обработайте следующую строку в onFailure или onResponse

Например:

override fun onResponse(call: Call<Place>?, response: Response<Place>?) {

        if(response != null && response.isSuccessful && response.body() != null) {
            val place: Place = response.body()!!

            println(place.toString())

            favouritePlaces.add(place)

            view.showFavouritePlaces(favouritePlaces) // <== Put it here
        }
}
0 голосов
/ 06 июля 2018

Я не знаю Kotlin, но в Java вы можете сделать это таким образом, если вы используете AsyncTask

    String jsonData = new AsyncTask(url).execute().get();
0 голосов
/ 06 июля 2018

Самое простое, что нужно сделать, это обернуть ваш цикл в AsyncTask и преобразовать ваш вызов дооснащения в синхронный. В onPostExecute вы можете выполнить настройку просмотра.

Если вы знакомы с RxJava, существует RxJava2CallAdapter для модернизации, который преобразует тип возвращаемого значения в наблюдаемые и обрабатывает их как поток.

...