MapFragment Google Maps API v2内存不足错误/内存泄漏

时间:2014-08-27 17:21:01

标签: android out-of-memory google-maps-android-api-2

过去几天我读了很多类似的帖子,但没有一个专门回答这个问题。在使用混合地图进行约2分钟的积极地图平移和缩放后,我开始收到OOM问题。该应用程序似乎也在崩溃后保留在内存中,因为在第一次失败后到达OOM所需的时间更少。我将代码缩减为只有一个带有MapFragment的Activity,并且仍然获得相同的OOM。除了添加只延迟OOM的android:largeHeap="true"之外,我还使用了DDMS和MAT来尝试找出问题。屏幕重定向不是问题,因为我在我的清单中设置了android:screenOrientation="portrait"。任何帮助将不胜感激。

更新2014-08-25:This is supposed to be fixed back in May 2013?

更新2014-09-06:仍然没有成功,唯一不错的选择是使用Normal代替Hybrid。 GC似乎能够在没有图像的情况下跟上。

类似帖子:

Out of memory error when using Google Maps API

Memory leak for Android Google Maps API v2

Android Google maps API, OutOfMemoryError

MainActivity:

public class MainActivity_blank extends Activity {

GoogleMap mMap;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main_activity_blank);
    setContentView(R.layout.map_fragment);

     setUpMapIfNeeded();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_activity_blank, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            // The Map is verified. It is now safe to manipulate the map.
            //startUsingMap();
            mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        }
    }
}
}

logcat的:

08-26 17:15:29.302: I/dalvikvm-heap(19642): Forcing collection of SoftReferences for 67108880-byte allocation
08-26 17:15:29.372: D/dalvikvm(19642): GC_BEFORE_OOM freed 822K, 65% free 37523K/106080K, paused 78ms, total 78ms
08-26 17:15:30.582: W/dalvikvm(19642): chunk is too big to transmit (length=49579336, 48435 bytes)
08-26 17:15:31.532: E/dalvikvm-heap(19642): Out of memory on a 67108880-byte allocation.
08-26 17:15:31.532: I/dalvikvm(19642): "GLThread 14876" prio=5 tid=19 RUNNABLE
08-26 17:15:31.532: I/dalvikvm(19642):   | group="main" sCount=0 dsCount=0 obj=0x42c120d8 self=0x787e8438
08-26 17:15:31.532: I/dalvikvm(19642):   | sysTid=19729 nice=1 sched=0/0 cgrp=apps handle=2021558416
08-26 17:15:31.532: I/dalvikvm(19642):   | state=R schedstat=( 51120733635 13119596807 80537 ) utm=1904 stm=3208 core=0
08-26 17:15:31.532: I/dalvikvm(19642):   at android.graphics.Bitmap.nativeCreate(Native Method)
08-26 17:15:31.532: I/dalvikvm(19642):   at android.graphics.Bitmap.createBitmap(Bitmap.java:924)
08-26 17:15:31.532: I/dalvikvm(19642):   at android.graphics.Bitmap.createBitmap(Bitmap.java:901)
08-26 17:15:31.532: I/dalvikvm(19642):   at android.graphics.Bitmap.createBitmap(Bitmap.java:868)
08-26 17:15:31.532: I/dalvikvm(19642):   at opl.a((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at okg.a((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at opy.a((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at opx.a((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at ojx.a((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at ojx.b((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at otq.k((null):-1)
08-26 17:15:31.532: I/dalvikvm(19642):   at otq.run((null):-1)
08-26 17:15:31.542: W/System.err(19642): OutOfMemory
08-26 17:15:31.642: D/dalvikvm(19642): GC_EXPLICIT freed 4803K, 64% free 38238K/106080K, paused 6ms+11ms, total 102ms
08-26 17:15:32.822: W/dalvikvm(19642): chunk is too big to transmit (length=49444016, 48303 bytes)
08-26 17:15:33.682: D/dalvikvm(19642): GC_FOR_ALLOC freed 3728K, 66% free 36916K/106080K, paused 65ms, total 65ms
08-26 17:15:34.752: W/dalvikvm(19642): chunk is too big to transmit (length=49398928, 48259 bytes)
08-26 17:15:35.462: I/dalvikvm-heap(19642): Forcing collection of SoftReferences for 67108880-byte allocation
08-26 17:15:35.512: D/dalvikvm(19642): GC_BEFORE_OOM freed 413K, 66% free 36502K/106080K, paused 52ms, total 52ms
08-26 17:15:36.742: W/dalvikvm(19642): chunk is too big to transmit (length=49398928, 48259 bytes)
08-26 17:15:37.282: E/dalvikvm-heap(19642): Out of memory on a 67108880-byte allocation.
08-26 17:15:37.282: I/dalvikvm(19642): "GLThread 14876" prio=5 tid=19 RUNNABLE
08-26 17:15:37.282: I/dalvikvm(19642):   | group="main" sCount=0 dsCount=0 obj=0x42c120d8 self=0x787e8438
08-26 17:15:37.282: I/dalvikvm(19642):   | sysTid=19729 nice=1 sched=0/0 cgrp=apps handle=2021558416
08-26 17:15:37.282: I/dalvikvm(19642):   | state=R schedstat=( 54770836691 14106993077 84458 ) utm=1996 stm=3481 core=0
08-26 17:15:37.282: I/dalvikvm(19642):   at android.graphics.Bitmap.nativeCreate(Native Method)
08-26 17:15:37.282: I/dalvikvm(19642):   at android.graphics.Bitmap.createBitmap(Bitmap.java:924)
08-26 17:15:37.282: I/dalvikvm(19642):   at android.graphics.Bitmap.createBitmap(Bitmap.java:901)
08-26 17:15:37.282: I/dalvikvm(19642):   at android.graphics.Bitmap.createBitmap(Bitmap.java:868)
08-26 17:15:37.282: I/dalvikvm(19642):   at opl.a((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at okg.a((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at opy.a((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at opx.a((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at ojx.a((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at ojx.b((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at otq.k((null):-1)
08-26 17:15:37.282: I/dalvikvm(19642):   at otq.run((null):-1)
08-26 17:15:37.432: W/dalvikvm(19642): threadid=19: thread exiting with uncaught exception (group=0x4178cda0)
08-26 17:15:37.442: E/AndroidRuntime(19642): FATAL EXCEPTION: GLThread 14876
08-26 17:15:37.442: E/AndroidRuntime(19642): Process: com.example.maptest, PID: 19642
08-26 17:15:37.442: E/AndroidRuntime(19642): java.lang.OutOfMemoryError
08-26 17:15:37.442: E/AndroidRuntime(19642):    at android.graphics.Bitmap.nativeCreate(Native Method)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at android.graphics.Bitmap.createBitmap(Bitmap.java:924)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at android.graphics.Bitmap.createBitmap(Bitmap.java:901)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at android.graphics.Bitmap.createBitmap(Bitmap.java:868)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at opl.a(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at okg.a(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at opy.a(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at opx.a(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at ojx.a(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at ojx.b(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at otq.k(Unknown Source)
08-26 17:15:37.442: E/AndroidRuntime(19642):    at otq.run(Unknown Source)
08-26 17:15:37.522: D/AbsListView(19642): unregisterIRListener() is called 
08-26 17:15:38.092: D/AbsListView(19642): onDetachedFromWindow
08-26 17:15:38.092: D/AbsListView(19642): unregisterIRListener() is called 
08-26 17:15:38.102: D/AbsListView(19642): onVisibilityChanged() is called, visibility : 8
08-26 17:15:38.102: D/AbsListView(19642): unregisterIRListener() is called

2 个答案:

答案 0 :(得分:0)

在相应的Fragment方法中尝试调用map onPause,onResume,onLowMemory。

答案 1 :(得分:0)

我遇到了这个问题,试图在演示模式下运行应用程序一次几个小时。无论我尝试了什么,30分钟后,我都会看到这个崩溃没有可读的堆栈报告。

我尝试了很多不同的东西,但这是唯一对我有用的东西。它不是地图错误的修复程序,但它使我的应用程序不会崩溃:

    <application
    ...
    android:largeHeap="true">