OSMdroid меняет TileSource во время выполнения - PullRequest
3 голосов
/ 16 января 2012

я работаю с osmdroid и хочу изменить TileSource во время выполнения (через пункт меню). Например, я могу переключаться между OSM TileSource и GoogleTileSource.

Проблема: все работает нормально, но когда я изменяю TileSource, пока представление карты загружает Tile в фоновом режиме, он меняет TileSource, но одна или две плитки принадлежат TileSource. Итак, я вижу смешанный MapView с OSMTiles и одним или двумя GoogleTiles.

TileCache очищается каждый раз после изменения TileSource. Но в данный момент фоновая загрузка не находится в кэше, поэтому он очистил ее после очистки.

Любая идея обойти эту проблему ?? Все основано на osmdroid, я работаю только с setTileSource(ITileSource)

Спасибо и привет

Ответы [ 3 ]

1 голос
/ 16 января 2012

Если вы используете osmdroid3.0.6.jar (и я думаю, что вы, как я могу воспроизвести эту ошибку, если я собираюсь с 3.0.6). Я думаю, что это еще одно проявление проблемы, которую я поднял osmdroid-android-3.0.6.jar, медленная загрузка плитки или ошибка . Эта ошибка была принята авторами.

Я предлагаю вам вернуться к использованию фляги 3.0.5. У меня нет проблем с этим. (Я все еще озадачен тем, как вы можете использовать плитки Google с Osmdroid)

1 голос
/ 16 января 2012

Выглядит как настоящая ошибка для меня.Я думаю, что вы должны сообщить об этом как таковой.Я не вижу ничего подобного в списке Issues .Похоже, что плохая плитка даже попадает в неправильный кеш на SD-карте, что очень плохо, поскольку она будет там некоторое время.

0 голосов
/ 17 января 2012

Я думаю, что все мы думаем, что это ошибка (или, возможно, не требуется переключать TileSource во время выполнения).

Я создал маленький обходной путь. Это работает, но это не очень приятно и не рекомендуется.

Я создал новый mapView и расширил osm MapView. Затем создайте RequestCompleteHandler, чтобы я мог видеть, когда плитка заканчивает загрузку и сохраняется в кеше. Чем я считаю каждую кэшированную плитку и разрешаю переключать tileSource только после загрузки 15 плиток. (в начале приложения 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);
    }

}

и вам нужно установить и инициализировать обработчик в конструкторе:

mHandler = new RequestCompleteHandler(this);
    getTileProvider().setTileRequestCompleteHandler(mHandler);

сделано. Теперь вы можете переключать tileSource только тогда, когда он уже загружает 15 плиток. Небольшая проблема: если источник не работает и не загружает какую-либо плитку, у вас проблемы: D

Но важно: это не рекомендуется, это действительно ужасный код

...