Mapbox,MapSnapshotter.callback 并不总是被调用

Mapbox, MapSnapshotter.callback is not always invoked

我主要在我的项目中使用 mapbox,但在一个实例中,我需要在 recyclerView 中显示地图。为此,我考虑使用 MapSnapshotter 而不是静态地图 Api,因为用户可能没有连接。

不幸的是,在进行测试时,我无法使 MapSnapshotter.callback 正常工作。有时图像是 loaded/created 有时不是,感觉确实是随机的。

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

所以经过一番折腾,我终于弄明白了。
问题是 MapSnapshotter.start 是一个异步任务,因为 phone 在第一次启动时在回收器视图中加载了 3 个项目,而每个项目依次调用MapSnapshotter.start 在上一个线程完成之前在同一个线程中,因此取消它。这解释了为什么只有最后一个项目加载了图像。

解决这个问题的一种方法是让异步任务变成同步任务,但我不推荐这个解决方案。

另一种方法是在您的适配器中添加一个 属性 MapSnapshotter。这样做,您的每个项目都将拥有自己的 MapSnapshotter。