gpt4 book ai didi

java - 在 Android Studio 中加载 Mapbox map 后绘制标记 [Java]

转载 作者:行者123 更新时间:2023-12-01 17:00:05 27 4
gpt4 key购买 nike

这是我在 Android Studio 中的第一个项目,基本上我正在尝试使用 Mapbox 开发具有多个标记的 map 。所以,我的问题是,在 map 上加载标记时,需要花费大量时间来加载 ~3-5 秒,并且应用程序会卡住,直到我从 API 调用中获取 json。这是我对 API 的 Retrofit2 调用:

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();
}
}

我将所有电台保存在名为 stationList 的 ArrayList 中。在车站类中,除了其他信息之外,我还有纬度和经度坐标。

这是我的 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})
));
}

经过多次搜索,我发现这里的“问题”是我在 getNearbyStations() 中使用 call.execute() ,它不是异步的,所以主线程正在等待站点加载。我尝试使用 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()))));
}

我猜我必须使用某种线程来解决这个问题,但我是使用 Android Studio 线程的初学者,我无法弄清楚。我认为解决方案是:

1.将 map 显示为空

2.加载后添加标记。

这样用户就不会遇到任何卡顿的情况。欢迎任何解决此问题的想法。

最佳答案

由于问题是您希望应用程序不等待同步函数,因此我建议为此使用异步任务。一旦调用异步任务的 onPostExecute 回调,您就可以执行 addMarkers 函数。但请确保仅在 onMapReady

中设置样式后才运行 addMarkers

请参阅此文档了解如何使用异步任务:https://developer.android.com/reference/android/os/AsyncTask

使用异步任务所带来的好处是,Android 会在不同的线程中执行它,从而减轻主线程的负载。

关于java - 在 Android Studio 中加载 Mapbox map 后绘制标记 [Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61522124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com