谷歌地图Android API v2 SupportMapFragment内存泄漏

Nim*_*ims 17 android google-maps-android-api-2 supportmapfragment android-maps-v2

使用2个简单的活动.第一个Activity只包含一个按钮来启动第二个包含地图的Activity:

主要活动:

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);
}
Run Code Online (Sandbox Code Playgroud)

地图活动:

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

}
Run Code Online (Sandbox Code Playgroud)

地图活动的XML布局:

<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"  
        />
Run Code Online (Sandbox Code Playgroud)

现在当我运行这段代码时,按下按钮移动到带有地图的Activity,然后按回去进入第一个活动...然后重复这个过程,我可以看到每次堆的大小都在增加,直到达到这是限制,然后开始钳制.如果你用地图(即缩放)混乱一点,我可以在这一点上获得一个OOM异常.

01-25 16:10:13.931:D/dalvikvm(21578):GC_FOR_ALLOC释放1898K,7%空闲45859K/49187K,暂停204ms 01-25
16:10:14.671:I/dalvikvm-heap(21578):Clamp target GC堆从52.724MB到48.000MB 01-25
16:10:14.671:D/dalvikvm(21578):GC_CONCURRENT释放2534K,6%释放46554K/49187K,暂停3ms + 14ms
01-25 16:10:15.372:I/dalvikvm -heap(21578):卡箍目标GC堆从52.979MB到48.000MB
01-25 16:10:15.382:d/dalvikvm(21578):GC_CONCURRENT释放2273K,免费46815K/49187K 5%,已暂停的3ms + 15ms的
01-25 16:10:15.622:I/dalvikvm-heap(21578):Clamp目标GC堆从52.604MB到48.000MB 01-25
16:10:15.622:D/dalvikvm(21578):GC_FOR_ALLOC释放657K,6%免费46431K/49187K,暂停202ms 01-25
16:10:16.203:I/dalvikvm-heap(21578):将目标GC堆从52.959MB夹紧到48.000MB 01-25
16:10:16.203:D/dalvikvm(21578):GC_FOR_ALLOC已释放1469K,5%免费46796K/49187K,暂停217ms 01-25
16:10:16.203:I/dalvikvm-heap(21578):强制收集SoftReferences以进行278744字节分配
01-25 16:10:16.4 23:I/dalvikvm-heap(21578):Clamp目标GC堆从52.952MB到48.000MB 01-25
16:10:16.423:D/dalvikvm(21578):GC_BEFORE_OOM释放9K,5%释放46786K/49187K,暂停219ms
01-25 16:10:16.423:E/dalvikvm-heap(21578):278744字节分配的内存不足.

任何建议/帮助将不胜感激.

Com*_*are 8

接近我从一些基本的MAT调查中可以看出,你看到的是由映射V2维护的下载地图数据的缓存.如果平移和缩放很多,缓存似乎会更大.如果您离开地图并稍后返回到新地图,缓存会缩小.我无法在N次启动示例应用程序的地图活动时获得N个缓存,缓存大小根据用户的行为而消失和流动.

唉,这个缓存是不可配置的,AFAIK,它有多大,什么时候被清除,它是否溢出到磁盘等等.

因此,默认情况下,您所能做的只是留出一堆健康的堆空间,供Maps V2使用,并采取措施保持在这个较小的堆子集中.

如果你想尝试,你可以尝试调用clear()GoogleMap,或onLowMemory()在你的SupportMapFragment,看看是否有帮助减少这种高速缓存的大小.


Mar*_*ujo -1

在您的布局中使用它:

\n\n
<LinearLayout\n        android:id="@+id/map_container2"\n        android:layout_width="match_parent"\n        android:layout_height="200dp"\n        android:layout_weight="35.22"\n        android:orientation="horizontal" >\n\n        <fragment\n            android:id="@+id/map1"\n            android:layout_width="match_parent"\n            android:layout_height="match_parent"\n            android:layout_weight="1"\n            class="com.google.android.gms.maps.SupportMapFragment"\n            map:cameraTargetLat="40.72"\n            map:cameraTargetLng="-74.00"\n            map:cameraZoom="8" />\n    </LinearLayout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这段代码:

\n\n
onCreate{\n   setUpMapIfNeeded();\n}\n\nprivate void setUpMapIfNeeded() {\n        // TODO Auto-generated method stub\n        // Do a null check to confirm that we have not already instantiated the map.\n        if (mMap == null) {\n            // Try to obtain the map from the SupportMapFragment.\n            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map1))\n                    .getMap();\n            // Check if we were successful in obtaining the map.\n            if (mMap != null) {\n                setUpMap();\n            }\n        }\n    }\n\nprivate void setUpMap() {\n        // TODO Auto-generated method stub\n         // Hide the zoom controls as the button panel will cover it.\n        mUiSettings = mMap.getUiSettings();\n // Enables/disables zoom gestures (i.e., double tap, pinch & stretch).\n        mMap.getUiSettings().setZoomGesturesEnabled(false);\n// Enables/disables scroll gestures (i.e. panning the map).\n        mMap.getUiSettings().setScrollGesturesEnabled(false);\n // Enables/disables the compass (icon in the top left that indicates the orientation of the\n        // map).\n        mMap.getUiSettings().setCompassEnabled(false);\n        // Add lots of markers to the map.\n        addMarkersToMap();\n\n        // Pan to see all markers in view.\n        // Cannot zoom to bounds until the map has a size.\n        final View mapView = getSupportFragmentManager().findFragmentById(R.id.map1).getView();\n        if (mapView.getViewTreeObserver().isAlive()) {\n            mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {\n                @SuppressLint("NewApi") // We check which build version we are using.\n                @Override\n                public void onGlobalLayout() {\n                    LatLngBounds bounds = new LatLngBounds.Builder()\n                            .include(WOODS)\n                            .build();\n                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {\n                      mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n                    } else {\n                      mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n                    }\n                    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));\n                }\n            });\n        }\n    }\n\nprivate void addMarkersToMap() {\n        // TODO Auto-generated method stub\n         // Uses a colored icon.\n        mWoods = mMap.addMarker(new MarkerOptions()\n                .position(WOODS)\n                .title("Woods")\n                .snippet("R. Quat\xc3\xa1, 1016, Vila Olimpia - (11) 3849-6868")\n                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));\n    }\n
Run Code Online (Sandbox Code Playgroud)\n