2012-03-03 12 views
0

MapViewを使用したアンドロイドアプリケーションがあり、ユーザーの携帯端末での最小限のユーザー操作で数時間連続して動作します。私はしばらくするとMapViewに何か起こり、完全に使えなくなってしまうことがわかりました。長時間の使用後にAndroid MapViewが破損する

アプリケーションがクラッシュすることはなく、マップはまだ存在しますが、破損しているようです。地図をつまむ/スクロールすると、タイルが揺れて飛び散り、マーカーがランダムに跳ね返ります。これは誰かが遭遇したようなものですか?

編集:バグはコードのそのセクションにあり、問題はそうであると仮定すると

public void updateMarkers(boolean centerMap) 
{ 
    log("updateMarkers(" + centerMap + ")"); 
    int vehicLat = (int) (AppState.getLatitude() * 1e6); 
    int vehicLng = (int) (AppState.getLongitude() * 1e6); 
    GeoPoint vehiclePoint = new GeoPoint(vehicLat, vehicLng); 

    List<Overlay> currentOverlays = mapView.getOverlays(); 
    if(!currentOverlays.isEmpty()) 
    { 
     currentOverlays.clear(); 
     mapView.postInvalidate(); 
    } 

    Drawable drawable = getResources().getDrawable(R.drawable.car); 
    MapOverlay iconOverlay = new MapOverlay(drawable, this); 
    OverlayItem iconPoint = new OverlayItem(vehiclePoint, "", ""); 
    iconOverlay.addOverlay(iconPoint); 
    currentOverlays.add(iconOverlay); 

    if(centerMap) 
    { 
     mapController.setCenter(vehiclePoint); 
     mapController.setZoom(17); 
    } 


    mapView.postInvalidate(); 
} 
+0

あなたが正確に何をしているのか?私はマップビュー(長期間)を使用する大規模なアプリケーションを持っていますが、私はこの動作が表示されません – debracey

+0

その基本的には、ユーザーの現在の場所を示し、時にはそれにいくつかのマーカーがあります。この問題は、拡張された使用の後にのみ発生するようです – TomBomb

+0

いくつかのコードは役に立ちます... – debracey

答えて

1

Drawable drawable = getResources().getDrawable(R.drawable.car); 
MapOverlay iconOverlay = new MapOverlay(drawable, this); 

あなたが作っている次のコードは、約10秒ごとに実行しますあなたが本当に必要なときに膨大な数の描画可能なオブジェクト1. Androidでの私の経験では、drawable(とBitmaps)上のガベージコレクションはかなり貧弱です(それについて十分読んで、実際に壊れているかどうか疑問に思うでしょう... )。私がやることは次のとおりです。

  1. ドロアブルをクラスで一度引き出します。ドロアブルを保管します - 10秒ごとに引っ張らないでください。
  2. currentOverlaysのリストをクリアする前に、各物のドロアブルをnullに設定してください。

例:

List<Overlay> currentOverlays = mapView.getOverlays(); 
if(!currentOverlays.isEmpty()) 
{ 
    for(Overlay o : currentOverlays) 
    { 
     // You need to a typecast here I think 
     o.setDrawable(null); 
    } 
    currentOverlays.clear();  
    mapView.postInvalidate(); 
} 
+0

非常に興味深い、私はdrawablesについてそれを知らなかった。私は今これを試してみるよ、ありがとう! – TomBomb

+0

私はこれ以上upvoteできればいいと思う。私が「ビットマップサイズがVM予算を超えている」という理由を理解しようと半日も苦労した。これはそれを修正したようだ。ありがとう! –

+0

うれしいことがありましたらうれしいです。 – debracey

関連する問題