我想我们都认为这是一个错误(或者它可能不想在运行时切换 TileSource)。
我创建了一个小 Workarround。它有效,但不是很好或推荐。
我创建了一个新的 mapView 并扩展了 osm MapView。比创建一个 RequestCompleteHandler,所以我可以看到瓦片何时完成加载并保存到缓存中。比我计算每个缓存的图块,并且只允许在加载 15 个图块后切换 tileSource。(在应用程序开始时 osmdroid 将加载 15 个图块,仅在移动地图后加载更多)
class RequestCompleteHandler extends SimpleInvalidationHandler{
private LbsMapView mMapView;
public RequestCompleteHandler(LbsMapView pView) {
super(pView);
mMapView = pView;
}
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
Log.d("DEBUG", "HANDLER HAT GERUFEN! BACKE BACKE KUCHEN!! " + tileCount);
tileCount++;
}
}
然后覆盖 setTileSource 方法:
@Override
public void setTileSource(ITileSource aTileSource) {
if(tileCount <= 15){
Toast.makeText(mContext, "Jetz eher nich", Toast.LENGTH_SHORT).show();
} else {
tileCount = 0;
super.setTileSource(aTileSource);
}
}
并且您需要在构造函数中设置和初始化 Handler:
mHandler = new RequestCompleteHandler(this);
getTileProvider().setTileRequestCompleteHandler(mHandler);
完毕。现在您只能在 tileSource 已加载 15 个图块时切换它。一个小问题:如果源不工作并且不加载任何瓷砖,那么你就有问题了:D
但重要的是:不推荐,它的代码真的很丑