mapview - Fuga de memoria de Google Maps Android API v2 SupportMapFragment
mapa android (4)
Usando 2 actividades simples. Primera actividad que solo contiene un botón para iniciar la segunda actividad que contiene el mapa:
Actividad principal:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goToMap(View view){ //This is just the onClick method for the button
Intent intent=new Intent( this, BigMapTest.class);
startActivity(intent);
}
La actividad del mapa:
public class BigMapTest extends FragmentActivity {
SupportMapFragment mapFragment;
GoogleMap map;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.travel_diary_big_map);
mapFragment=(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.big_map);
map=mapFragment.getMap();
}
El diseño XML para la actividad del mapa:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/big_map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.SupportMapFragment"
/>
Ahora, cuando ejecuto este código, presionando el botón para moverme a la Actividad con el mapa, y presionando para regresar a la primera actividad ... luego, repitiendo el proceso, puedo ver que el montón aumenta de tamaño cada vez, hasta que alcanza Es límites y luego comienza a sujetarse. Si te metes un poco más con el mapa (es decir, con el zoom), puedo obtener una excepción de OOM en este momento.
01-25 16: 10: 13.931: D / dalvikvm (21578): GC_FOR_ALLOC liberado 1898K, 7% libre 45859K / 49187K, 204ms en pausa
01-25 16: 10: 14.671: I / dalvikvm-heap (21578): Clamp objetivo de GC de 52.724MB a 48.000MB
01-25 16: 10: 14.671: D / dalvikvm (21578): GC_CONCURRENT liberado 2534K, 6% libre 46554K / 49187K, pausado 3ms + 14ms
01-25 16: 10: 15.372: I / dalvikvm-heap (21578): Clamp target heap GC de 52.979MB a 48.000MB
01-25 16: 10: 15.382: D / dalvikvm (21578): GC_CONCURRENT liberado 2273K, 5% libre 46815K / 49187K, pausado 3ms + 15ms
01-25 16: 10: 15.622: I / dalvikvm-heap (21578): Clamp objetivo de GC de 52.604MB a 48.000MB
01-25 16: 10: 15.622: D / dalvikvm (21578): GC_FOR_ALLOC liberado 657K, 6% libre 46431K / 49187K, pausado 202ms
01-25 16: 10: 16.203: I / dalvikvm-heap (21578): Clamp objetivo de GC de 52.959MB a 48.000MB
01-25 16: 10: 16.203: D / dalvikvm (21578): GC_FOR_ALLOC liberado 1469K, 5% libre 46796K / 49187K, pausado 217ms
01-25 16: 10: 16.203: I / dalvikvm-heap (21578): Forzando la recopilación de SoftReferences para la asignación de 278744 bytes
01-25 16: 10: 16.423: I / dalvikvm-heap (21578): Clamp objetivo de GC de 52.952MB a 48.000MB
01-25 16: 10: 16.423: D / dalvikvm (21578): GC_BEFORE_OOM liberado 9K, 5% libre 46786K / 49187K, pausado 219ms
01-25 16: 10: 16.423: E / dalvikvm-heap (21578): Sin memoria en una asignación de 278744 bytes.
Cualquier sugerencia / ayuda sería apreciada.
Desarrolladores de Android 5:10 PM - Página de Google+
Estamos implementando los servicios de Google Play v3.0, que introduce el inicio de sesión de Google+ y las mejoras de la API de Android de Google Maps.
A partir del 26 de febrero de 2013, este problema que también se describe en la página gmaps-api-issues ahora se ha corregido con la actualización actual de la API de Google .
Por lo que puedo decir de un análisis de MAT básico, lo que está viendo es un caché mantenido por Maps V2 de datos de mapas descargados. El caché parece ser más grande si se desplaza y se acerca mucho. La memoria caché se reduce si deja el mapa y vuelve a un mapa nuevo más adelante. No pude obtener N cachés de N veces iniciando la actividad del mapa de su aplicación de muestra, y el tamaño de la caché disminuyó y dependió de lo que hizo el usuario.
Lamentablemente, este caché no se puede configurar, AFAIK, en términos de cuán grande es, cuando se borra, se derrama en el disco, etc.
Por lo tanto, de manera predeterminada, todo lo que puede hacer es dejar de lado una buena parte de su espacio de almacenamiento para que juegue Maps V2, y tomar medidas para mantenerse dentro de este subconjunto más pequeño de almacenamiento dinámico.
Si desea experimentar, puede intentar llamar a clear()
en GoogleMap
o onLowMemory()
en su SupportMapFragment
, para ver si hay alguna ayuda para reducir este tamaño de caché.
Tengo exactamente el mismo problema. La memoria aumenta cada vez que comienza la actividad que aloja el mapa V2. Y no se libera ni siquiera cuando termina la actividad.
Así que la solución es reutilizar esa actividad. Haga que la actividad singleTask
en manifiesto y en lugar de finish()
, use moveTaskToBack(true);
Use esto en su diseño:
<LinearLayout
android:id="@+id/map_container2"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_weight="35.22"
android:orientation="horizontal" >
<fragment
android:id="@+id/map1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
class="com.google.android.gms.maps.SupportMapFragment"
map:cameraTargetLat="40.72"
map:cameraTargetLng="-74.00"
map:cameraZoom="8" />
</LinearLayout>
Y este código:
onCreate{
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// TODO Auto-generated method stub
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map1))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
// TODO Auto-generated method stub
// Hide the zoom controls as the button panel will cover it.
mUiSettings = mMap.getUiSettings();
// Enables/disables zoom gestures (i.e., double tap, pinch & stretch).
mMap.getUiSettings().setZoomGesturesEnabled(false);
// Enables/disables scroll gestures (i.e. panning the map).
mMap.getUiSettings().setScrollGesturesEnabled(false);
// Enables/disables the compass (icon in the top left that indicates the orientation of the
// map).
mMap.getUiSettings().setCompassEnabled(false);
// Add lots of markers to the map.
addMarkersToMap();
// Pan to see all markers in view.
// Cannot zoom to bounds until the map has a size.
final View mapView = getSupportFragmentManager().findFragmentById(R.id.map1).getView();
if (mapView.getViewTreeObserver().isAlive()) {
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressLint("NewApi") // We check which build version we are using.
@Override
public void onGlobalLayout() {
LatLngBounds bounds = new LatLngBounds.Builder()
.include(WOODS)
.build();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
}
});
}
}
private void addMarkersToMap() {
// TODO Auto-generated method stub
// Uses a colored icon.
mWoods = mMap.addMarker(new MarkerOptions()
.position(WOODS)
.title("Woods")
.snippet("R. Quatá, 1016, Vila Olimpia - (11) 3849-6868")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
}