3

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

问题:一切正常,但是当我在地图视图在后台加载 Tile 时更改 TileSource 时,它​​会更改 TileSource 但一两个瓷砖来自之前的 TileSource。所以我看到一个混合 MapView 与 OSMTiles 和一个或两个 GoogleTiles。

每次更改 TileSource 后都会清除 tileCache。但是后台加载的瓦片此时不在缓存中,所以他把这个瓦片放到缓存中,清除后。

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

谢谢和问候

4

3 回答 3

1

如果您使用的是 osmdroid3.0.6.jar(我认为您是,因为如果我使用 3.0.6 构建,我可以重现此错误)。我认为这是我提出osmdroid-android-3.0.6.jar, tile loading slow or failed问题的另一种表现。这个错误已被作者接受。

我建议您重新使用 3.0.5 jar。我对此没有任何问题。(我仍然对你如何在 Osmdroid 中使用 Google 磁贴感到困惑)

于 2012-01-16T16:31:41.397 回答
1

对我来说似乎是一个适当的错误。我认为你应该这样报告。我在问题列表中看不到类似的东西。看起来坏磁贴甚至进入了 sd 卡上的错误缓存,这很糟糕,因为它会在那里存在一段时间。

于 2012-01-16T16:06:19.330 回答
0

我想我们都认为这是一个错误(或者它可能不想在运行时切换 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

但重要的是:不推荐,它的代码真的很丑

于 2012-01-17T11:00:04.750 回答