2012-01-16 1 views
3

저는 osmdroid로 작업 중이며 런타임시 (메뉴 항목을 통해) TileSource를 변경하려고합니다. 예를 들어 OSM TileSource와 GoogleTileSource간에 변경할 수 있습니다.OSMdroid는 런타임에 TileSource를 변경합니다.

문제점 : 모든 것이 잘 작동하지만 mapview가 백그라운드에서 타일을로드하는 동안 TileSource를 변경하면 TileSource가 변경되지만 하나 또는 두 개의 타일은 TileSource befor에서 변경됩니다. 따라서 OSMTiles와 하나 또는 두 개의 GoogleTiles가있는 MapView가 혼합되어 있습니다.

tileCache는 TileSource를 변경 한 후에 매번 지워집니다. 그러나 배경에있는로드 타일은 현재 캐시에 있지 않으므로 캐시 타일을 비운 후에 캐시에이 타일을 놓습니다.

이 문제를 해결할 수있는 아이디어는 무엇입니까 ?? 그것은 모든 osmdroid을 기반으로, 난 단지 setTileSource(ITileSource)

감사 Greetz

+0

? TileSourceFactory의 상수 내에서 옵션으로 보지 않습니다. – NickT

+0

@NickT : 그는 mapview 활동 (타일 소스가 아님)을 바꾼 것 같아요 –

+0

아니요 TileSources 만 바꿔서 Google 용 내 TileSource를 만들었습니다 ;-) – Informatic0re

답변

1

나에게 적절한 벌레처럼 보이는 작동합니다. 나는 당신이 그렇게보고해야한다고 생각합니다. 내가 issues 목록에있는 것과 같은 것을 볼 수 없습니다. 나쁜 타일이 SD 카드의 잘못된 캐시에 들어가는 것처럼 보입니다. SD 카드는 잠시 동안 거기에있게 될 것입니다.

1

osmdroid3.0.6.jar를 사용하고 있다면 (나는 3.0.6으로 빌드하면이 버그를 재현 할 수있다.) 제기 한 문제의 또 다른 징후라고 생각합니다. osmdroid-android-3.0.6.jar, tile loading slow or fails. 이 버그는 저자가 받아 들였습니다.

3.0.5 항아리로 돌아가시기 바랍니다. 나는 그것에 아무런 문제가 없다. (저는 여전히 Osmdroid에서 Google 타일을 사용하는 방법에 대해 의아해합니다.)

+0

감사합니다. 또한 버그라고 생각합니다. (Google 타일의 경우이 페이지가 필요합니다. http://mt3.google.com/vt/v=w2.97&x=74327&y=50500&z=17 osmdroid 용 oun TileSource 생성) – Informatic0re

+0

이것이 다른 문제라고 생각합니다. 내 응용 프로그램에서 3.0.5로 돌아가서 같은 효과를 보았습니다. 내 경우에 – Ifor

+0

그것은 천천히뿐만 아니라. 나는 osmdroid의 src를 들여다 보았다. setTileSource() 메서드에서 캐시를 지우지 만 현재 다운로드 또는 다른 것을 중지하지 않습니다. 따라서 캐시는 깨끗하지만 다운로드가로드되고 완료되면 타일이 캐시에 저장됩니다. 따라서 그는 오래된 TileSource 타일 중 1 ~ 2 개를 캐시에 넣은 다음 새 타일을 넣을 가능성이 있습니다. 나는 workarround를 찾았지만 정말로 좋은 것은 아니다. 나는 대답으로 그것을 넣을 것이다. – Informatic0re

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) :

@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); 

완료되었습니다. 타일 ​​소스가 이미 15 개의 타일을로드 할 때만 타일 소스를 전환 할 수 있습니다. 약간의 문제 : 소스가 작동하지 않는 당신은 문제가있는 모든 타일로드되지 않는 경우 : D

그러나 중요한 : 그것은 그것 정말 추한 코드를 사용하지 않는 것이 좋습니다 당신이에서 Google 타일을받을 수 있나요

+0

당신은 그것이 항상 15 개의 타일이 될 것이라고 확신 하는가? 캐시가 9로 시작한 다음 16으로 증가했다고 생각했는데, 적어도 그것이 내 경우의 logcat에서 볼 수 있습니다. – Ifor

+0

100 % 확신 할 수는 없지만지도를 이동하지 않고 앱을 시작한 후 15 세라고 계산했습니다. 그러나지도를 이동하고 TileSource를 전환하면 타일이 섞여있는 경우도 발생합니다. 그러나 사용자는 빠를 필요가 있습니다. – Informatic0re

+0

osmdroid에 대한 문제로 게시 ... setTileSource를 사용한 후 다운로드 대기열을 지울 필요가 있으므로 새 버전을 기다려야한다고 생각합니다. – Informatic0re