2010-05-17 2 views
2

Я сделал приложение для Android с googlemap api и нарисую примерно 16x16 png (около 200 count) на overlay. Когда я перемещаю или приближаюсь к/в карте, ошибка «из памяти» возникает очень часто.Android googlemap Недостаточно памяти

Я также использовал приложение googlemap в своем самом htc. Швы, что он использует около 14 + МБ memmory, и никогда не бывает «вне памяти».

Как сохранить использование memmory в api googlemap или как увеличить ограничение андроида api memmory.

Большое спасибо!

+0

См. Мой ответ на другой вопрос по той же проблеме: [android MapView всегда вызывает OutOfMemoryError во вложенных элементах) (http://stackoverflow.com/questions/5460650/android-mapview-always-causes-an-outofmemoryerror- in-embedded-elements/6134375 # 6134375) [Группы Google: проблема 2181: утечка памяти в системе при использовании MapView] (http://code.google.com/p/android/issues/detail?id=2181) – Muzikant

ответ

2

Мое собственное решение: Попадание OutOfMemoryError при масштабировании/масштабировании предотвратит уничтожение api виртуальной машиной. Потому что он обычно умирает при выполнении масштабирования карты после перевода.

mapView.setBuiltInZoomControls(true); 
    ZoomButtonsController zoomctrl = mapView.getZoomButtonsController(); 
    zoomctrl.setAutoDismissed(false);//自动隐藏关闭 
    zoomctrl.setVisible(true); 
    zoomctrl.setOnZoomListener(new ZoomButtonsController.OnZoomListener() { 

     public void onZoom(boolean zoomIn) { 
      // TODO Auto-generated method stub 
      try{ 
       Log.i(TAG, "OnZoomListener"); 
       System.gc(); 
       if(zoomIn) 
       {      
        mc.zoomIn(); 
       } 
       else 
       { 
        mc.zoomOut(); 
       } 
       System.gc(); 
      } 
      catch(OutOfMemoryError e) 
      { 
       e.printStackTrace(); 
       Log.e(TAG, e.toString()); 
       Toast.makeText(GoogleMap.this, e.toString(), Toast.LENGTH_LONG); 
      } 
      catch (Exception e) 
      { 
       Log.w(TAG, e.toString()); 
       Toast.makeText(GoogleMap.this, e.toString(), Toast.LENGTH_LONG); 
      }    
     } 

     public void onVisibilityChanged(boolean visible) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    private boolean myDoubleTouch(float x, float y, MapView mapView) 
    { 
    Log.i(mParent.TAG, "myDoubleTouch: " + x +","+y); 
    try 
    { 
     mapView.getController().zoomInFixing((int)x, (int)y); 
    } 
    catch(OutOfMemoryError e) 
    { 
     System.gc(); 
     e.printStackTrace(); 
     Log.e(mParent.TAG, e.toString()); 
     Toast.makeText(m_mapview.getContext(), e.toString(), Toast.LENGTH_LONG); 
    } 
    catch (Exception e) 
    { 
     Log.w(mParent.TAG, e.toString()); 
     Toast.makeText(m_mapview.getContext(), e.toString(), Toast.LENGTH_LONG); 
    }   

    return true; 
} 
0
public class CustomMapView extends MapView { 
    // private Context context; 
    public CustomMapView(Context context, String apiKey) { 

    super(context, apiKey); 
    // this.context = context; 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    try { 
     return super.dispatchTouchEvent(ev); 

    } catch (Exception ex) { 

      //  Log.e("CustomMapView", "Caught the exception"); 
     int zoomLevel = getZoomLevel(); 
     getController().setZoom(zoomLevel-1); 
     super.setVisibility(View.GONE); 
     super.setVisibility(View.VISIBLE); 
    } 

    return true; 
} 

@Override 
public void draw(Canvas canvas) { 
    try { 
     super.draw(canvas); 
    } catch (Exception e) { 

      //  Log.e("CustomMapView", "Caught the exception"); 
     int zoomLevel = getZoomLevel(); 
     getController().setZoom(zoomLevel-1); 
     super.setVisibility(View.GONE); 
     super.setVisibility(View.VISIBLE); 
    } 
} 

public CustomMapView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // this.context = context; 
} 

public CustomMapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // this.context = context; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    System.gc(); 
    return super.onTouchEvent(ev); 
} 

} 

Наряду с onZoomListener, я добавил свой собственный CustomMapView, который проходит MapView. Это решило исключение памяти в моем приложении.

Смежные вопросы