OSMdroid在运行时更改TileSource

时间:2012-01-16 14:52:58

标签: android tiles osmdroid openstreetmap

我使用osmdroid,我想在运行时更改TileSource(通过菜单项)。例如,我可以在OSM TileSource和GoogleTileSource之间进行更改。

问题:一切正常,但是当我在mapview在后台加载Tile时更改TileSource时,它会更改TileSource,但是一个或两个tile来自TileSource befor。所以我看到一个带有OSMTiles的混合MapView和一个或两个GoogleTiles。

更改TileSource后,每次都会清除tileCache。但此时背景中的加载图块不在缓存中,因此在清除之后,他将此图块放入缓存中。

任何想法解决这个问题?它全部基于osmdroid,我只使用setTileSource(ITileSource)

谢谢和Greetz

3 个答案:

答案 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

但重要的是:它不推荐,它的真实难看的代码