我希望我的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)
}
}
})
}
答案 0 :(得分:1)
最简单的方法是将循环包装在AsyncTask
中,并将改造调用转换为同步调用。在onPostExecute
中,您可以执行视图设置。
如果您熟悉RxJava,则可以使用RxJava2CallAdapter进行改造,将返回类型转换为可观察值,并将其作为流处理。
答案 1 :(得分:0)
处理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
}
}
答案 2 :(得分:0)
我不知道Kotlin
,但是在Java
中,如果您使用的是AsyncTask
,则可以通过这种方式完成
String jsonData = new AsyncTask(url).execute().get();