我使用osmdroid,我想在运行时更改TileSource(通过菜单项)。例如,我可以在OSM TileSource和GoogleTileSource之间进行更改。
问题:一切正常,但是当我在mapview在后台加载Tile时更改TileSource时,它会更改TileSource,但是一个或两个tile来自TileSource befor。所以我看到一个带有OSMTiles的混合MapView和一个或两个GoogleTiles。
更改TileSource后,每次都会清除tileCache。但此时背景中的加载图块不在缓存中,因此在清除之后,他将此图块放入缓存中。
任何想法解决这个问题?它全部基于osmdroid,我只使用setTileSource(ITileSource)
谢谢和Greetz
答案 0 :(得分:1)
对我来说看起来是个合适的错误。我想你应该这样报道。我在issues列表中看不到类似的内容。看起来坏的磁贴甚至进入了sd卡上的错误缓存,这很糟糕,因为它会存在一段时间。
答案 1 :(得分:1)
如果您正在使用osmdroid3.0.6.jar(我认为您是,因为如果我使用3.0.6构建,我可以重现此错误)。我认为这是我提出的osmdroid-android-3.0.6.jar, tile loading slow or fails问题的另一种表现形式。这个bug已经被作者接受了。
我建议你回去使用3.0.5 jar。我没有遇到任何问题。 (我仍然对如何使用Osmdroid的Google磁贴感到困惑)
答案 2 :(得分:0)
我认为我们都认为这是一个错误(或者可能不希望在运行时切换TileSource)。
我创建了一个Workarround。它可以工作但不是很好或推荐。
我创建了一个新的mapView并扩展了osm MapView。然后创建一个RequestCompleteHandler,这样我就可以看到一个tile完成加载并保存到缓存中。比我计算每个缓存的磁贴,只允许在加载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个tile时,才可以切换它。 一个小问题:如果源不工作并且没有加载任何瓷砖你就会遇到问题:D
但重要的是:它不推荐,它的真实难看的代码