Я пытаюсь получить данные из нескольких местоположений JSON в асинхронных запросах с Retrofit 2 и Converter-Gson.
Вот содержимое файла .json, который содержит массив URL-адресов:
[
"http://google.com/file/data/points/1"
"http://google.com/file/data/points/2"
"http://google.com/file/data/points/3"
"http://google.com/file/data/points/4"
.
.
.
"http://google.com/file/data/points/2171"
]
Абсолютная ссылка на этот файл: "http://google.com/file/data/points.json"
Каждый из этих URL-адресов показывает один объект json, подобный следующему:
{"latitude":49.4895069,"longitude":1.2196601}
Я создал класс модели:
class Point(val latitude: Double, val longitude: Double)
и два интерфейса:
public interface Api {
String BASE_URL = "http://google.com/file/data/";
@GET("points.json")
Call<List<String>> getAllLinks();
}
и
public interface GetPoint {
@GET
Call<Point> getData(@Url String url);
}
В (основном) задании я использую Retrofit Builder и службу Call длясоздайте список URL-адресов, а затем зациклитесь на этом списке, чтобы получить все данные, как показано здесь:
val retrofitJson = Retrofit.Builder()
.baseUrl(Api.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val serviceJson: Api = retrofitJson.create(Api::class.java)
val call: Call<List<String>> = serviceJson.allLinks
call.enqueue(object : Callback<List<String>> {
override fun onResponse(call: Call<List<String>>, response: Response<List<String>>) {
val listLink = response.body()
val service: GetPoint = retrofitJson.create(GetPoint::class.java)
for (i in 0 until listLink!!.size) {
val c: Call<Point> = service.getData(listLink[i])
c.enqueue(object : Callback<Point> {
override fun onResponse(call: Call<Point>, response: Response<Point>) {
if (response.isSuccessful) {
val point = response.body()
listPoints.add(point!!)
adapter.notifyDataSetChanged()
}
}
override fun onFailure(call: Call<Point>, t: Throwable) {
Log.i("Erreur", "Can't access the desired resource")
}
})
}
Toast.makeText(applicationContext, "All the data has been retrieved . ${listPoints.size} points have been created", Toast.LENGTH_LONG).show()
}
override fun onFailure(call: Call<List<String>>, t: Throwable) {
Log.i("Error", "Can't access the desired url")
}
})
}
Проблема в том, что сообщение о тосте всегда: «0 точек были созданы».Как я могу выполнить тост (и выполнить другие действия) после получения всех данных?
Заранее большое спасибо.