Рисование маркеров после загрузки карты mapbox в Android Studio [Java] - PullRequest
0 голосов
/ 30 апреля 2020

Это мой первый проект в Android Studio, в основном я пытаюсь разработать карту с несколькими маркерами, используя Mapbox. Итак, моя проблема заключается в том, что при загрузке маркеров на карте загрузка занимает ~ 3-5 секунд, и приложение останавливается, пока я не получу json от моего вызова API. Вот мой вызов дооснащения API2:

private void getNearbyStations() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("***")//my API, not relevant
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
        Utilizator utilizator = Utilizator.getUtilizatorInstance();
        Call<ResponseNearbyStations> call = jsonPlaceHolderApi.getNearbyStations(utilizator.getAuthentificationKey(), 47.1744354, 27.5746688);//Static Lat and Long for test, in future will use current location
        try {
            ResponseNearbyStations body = call.execute().body();
            JsonObject jsonObject = body.getData();
                    JsonArray ja_data = jsonObject.getAsJsonArray("stationAround");
                    Station[] statiiPrimite = gson.fromJson(ja_data, Station[].class);
                    stationList = new ArrayList<>(Arrays.asList(statiiPrimite));
        } catch (IOException e) {
            e.printStackTrace();
        }
}

Я сохраняю все свои станции в ArrayList с именем stationList. В классе Station у меня есть координаты широты и долготы помимо другой информации.

Вот моя функция addMarkers:

    private void addMarkers(@NonNull Style loadedMapStyle) {
        List<Feature> features = new ArrayList<>();

        for(Station statie:stationList){    
 features.add(Feature.fromGeometry(Point.fromLngLat(Double.valueOf(statie.getCoordinates().getLongitude()),
Double.valueOf(statie.getCoordinates().getLatitude()))));
        }

        loadedMapStyle.addSource(new GeoJsonSource(MARKER_SOURCE, FeatureCollection.fromFeatures(features)));

        loadedMapStyle.addLayer(new SymbolLayer(MARKER_STYLE_LAYER, MARKER_SOURCE)
                .withProperties(
                        PropertyFactory.iconAllowOverlap(true),
                        PropertyFactory.iconIgnorePlacement(true),
                        PropertyFactory.iconImage(MARKER_IMAGE),
                        PropertyFactory.iconOffset(new Float[]{0f, -52f})
                ));
    }

Так что после нескольких поисков я обнаружил, что «проблема» в том, что я использую call.execute () in getNearbyStations () , которая не является асинхронной c, поэтому основной поток ожидает загрузки станций. Я пытался использовать call.enqueue , но после этого у меня возникла другая проблема, в моей функции addMarkers я получаю NullPointerException, потому что stationList не имеет достаточно времени для загрузки в

for(Station statie:stationList){    
 features.add(Feature.fromGeometry(Point.fromLngLat(Double.valueOf(statie.getCoordinates().getLongitude()),
Double.valueOf(statie.getCoordinates().getLatitude()))));
        }

Я предполагаю, что мне нужно использовать какой-то Threading для решения этой проблемы, но я новичок в использовании Threads для Android Studio, и я не мог понять это. Я думаю, что решение будет следующим:

1.Отобразите карту пустой

2.Добавьте маркеры после загрузки.

Таким образом, пользователь не испытывает никакого зависания , Любая идея, как решить эту проблему, приветствуется.

1 Ответ

0 голосов
/ 07 мая 2020

Поскольку проблема в том, что вы хотите, чтобы приложение не ожидало синхронной функции, я бы порекомендовал использовать для этого асинхронную задачу. Затем можно выполнить функцию addMarkers после вызова onPostExecute обратного вызова задачи asyn c. Но обязательно запускайте addMarkers только после того, как стиль был установлен в вашем onMapReady

Пожалуйста, ознакомьтесь с этой документацией по использованию асинхронной задачи: https://developer.android.com/reference/android/os/AsyncTask

Приятный побочный эффект, который вы получаете, используя асинхронную задачу, заключается в том, что Android выполнит ее в другом потоке и тем самым снимет нагрузку с основного потока.

...