Я пытаюсь отобразить пользовательский векторный слой на карте с помощью Mapbox в своем приложении для Android. Использование последней версии мапбокса.
Когда я включаю слой следующим образом:
//DOES NOT WORK
binding.mapView.getMapAsync(mapboxMap -> {
map = mapboxMap;
VectorSource source = new VectorSource("source-id", new TileSet("2.1.0", baseUrl + "/{z}/{x}/{y}.mvt"));
mapboxMap.addSource(source);
LineLayer layer = new LineLayer("zones-outline", "source-id");
layer.setSourceLayer("zones");
layer.setProperties(
PropertyFactory.lineWidth(2f),
PropertyFactory.lineColor(getResources().getColor(R.color.md_blue_500))
);
mapboxMap.addLayer(layer);
})
Он ничего не показывает (нет входа в Android или на моем сервере, похоже, что слой даже не известен мапбоксу).
Но если я помещу код addsource и addlayer в исполняемый файл, скажем, с задержкой в 100 миллисекунд, он правильно отобразит мои слои. Очевидно, это похоже на какой-то параллелизм или «порядок инициализации», и задержка работает, но это не очень хорошее и правильное решение (я полагаю, что на старом устройстве загрузка карты может занять более 100 мс, может не получится).
//WORKS
binding.mapView.getMapAsync(mapboxMap -> {
final Handler handler = new Handler();
handler.postDelayed(() -> {
map = mapboxMap;
VectorSource source = new VectorSource("source-id", new TileSet("2.1.0", baseUrl + "/{z}/{x}/{y}.mvt"));
mapboxMap.addSource(source);
LineLayer layer = new LineLayer("zones-outline", "source-id");
layer.setSourceLayer("zones");
layer.setProperties(
PropertyFactory.lineWidth(2f),
PropertyFactory.lineColor(getResources().getColor(R.color.md_blue_500))
);
mapboxMap.addLayer(layer);
}, 100)
})
Есть ли другой метод/обратный вызов, где я должен поместить эту инициализацию? Как убедиться, что мои слои будут нарисованы?