在转到下一行之前,如何等待异步任务完成?

时间:2018-07-06 07:02:21

标签: android asynchronous retrofit retrofit2

我希望我的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 :(得分:1)

最简单的方法是将循环包装在AsyncTask中,并将改造调用转换为同步调用。在onPostExecute中,您可以执行视图设置。

如果您熟悉RxJava,则可以使用RxJava2CallAdapter进行改造,将返回类型转换为可观察值,并将其作为流处理。

答案 1 :(得分:0)

处理onFailureonResponse中的下一行

例如:

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
        }
}

答案 2 :(得分:0)

我不知道Kotlin,但是在Java中,如果您使用的是AsyncTask,则可以通过这种方式完成

    String jsonData = new AsyncTask(url).execute().get();