Android: Как реализовать асинхронный цикл в списке URL (для Json)? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь получить данные из нескольких местоположений 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 точек были созданы».Как я могу выполнить тост (и выполнить другие действия) после получения всех данных?

Заранее большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...