Mapbox, MapSnapshotter.callback не всегда вызывается - PullRequest
0 голосов
/ 27 июня 2018

Я в основном использую mapbox в моем проекте, но в одном случае мне нужно отобразить карту в программе recyclerView. Для этого я подумал об использовании MapSnapshotter вместо статического Map Api, поскольку у пользователя может не быть подключения.

К сожалению, при выполнении моего тестирования я не могу заставить MapSnapshotter.callback работать должным образом. Иногда изображение загружается / создается, а иногда - нет, и оно кажется случайным.

 Mapbox.getInstance(this, MyMapbox.getToken());
 mapView.onCreate(savedInstanceState);
 mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(MapboxMap mapboxMap) {
            map = mapboxMap;
            MapSnapshotter.Options options = new MapSnapshotter.Options(mapView.getMeasuredWidth(),mapView.getMeasuredHeight());
            options.withRegion(mapboxMap.getProjection().getVisibleRegion().latLngBounds);
            options.withStyle(mapboxMap.getStyleUrl());

            MapSnapshotter mapSnapshotter = new MapSnapshotter(getContext(), options);

            mapSnapshotter.start(new MapSnapshotter.SnapshotReadyCallback() {
                @Override
                public void onSnapshotReady(MapSnapshot snapshot) {
                    Log.i(LOG_TAG, "onSnapshotReady");
                    Bitmap bitmap = snapshot.getBitmap();
                    imageview.setImageBitmap(bitmap);
                }

            }, new MapSnapshotter.ErrorHandler() {
                @Override
                public void onError(String error) {
                    Log.i(LOG_TAG, error);
                }
            });
        }
    });

1 Ответ

0 голосов
/ 04 июля 2018

Итак, после некоторого скручивания, я наконец-то понял это.
Проблема заключалась в том, что MapSnapshotter.start является асинхронной задачей, и поскольку телефон загружает 3 элемента в представлении программы повторного запуска при первом запуске, и каждый из них вызывает MapSnapshotter.start в том же потоке перед предыдущий сделан, поэтому отменим его. Это объясняет, почему только последний элемент имеет загруженное изображение.

Чтобы решить эту проблему, нужно сделать задачу Async синхронизированной, но я не рекомендую это решение.

Другой способ - добавить свойство MapSnapshotter в ваш адаптер. При этом каждый ваш элемент будет иметь свой собственный MapSnapshotter.

...