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。
我主要在我的项目中使用 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。