使用Google Maps API时内存不足错误

我在这里有一个应用程序,它具有在地图上显示POI的功能。 它只是一个POI,它只在实际位于可见屏幕区域内时才绘制。 它完美的工作了一段时间,但如果我玩弄放大和缩小和拖动,它最终会崩溃。 根据Logcat,原因总是OutOfMemory错误。

起初,我认为这是Google Maps API的一个漏洞。 经过一番研究并看到一些罗曼盖伊的帖子后,我确信我在我的应用程序上做了一些愚蠢的事情,导致我时不时发现内存不足。 然后我用堆分析器(Eclipse)进行了一些更详细的测试,我发现即使我有2+,有时候剩余3个剩余空间的剩余内存,我仍然得到了由OutOfMemoryError引起的令人讨厌的强制关闭消息。 大多数情况下,当试图分配一些614kb的内存块时会崩溃,而不管我剩下多少内存。

这个问题在Nexus One 2.2.1和HTC Evo 2.1上发生了很多。 经过一些小测试后,我在G1 1.6和三星Galaxy S i9000 2.1上都没有发生故障。 但我无法确定G1和Galaxy在更多测试后不会出现这个问题。

我只能想到内存碎片问题。 我希望这个问题有一个解决方案。 我也会很高兴,如果我能赶上这个错误,并防止应用程序崩溃。

如果有帮助,这里是logcat:

09-29 08:58:06.661: ERROR/dalvikvm-heap(1552): 648000-byte external allocation too large for this process.
09-29 08:58:06.661: ERROR/dalvikvm(1552): Out of memory: Heap Size=9991KB, Allocated=6980KB, Bitmap Size=14510KB
09-29 08:58:06.661: ERROR/(1552): VM won't let us allocate 648000 bytes
09-29 08:58:06.672: DEBUG/AndroidRuntime(1552): Shutting down VM
09-29 08:58:06.672: WARN/dalvikvm(1552): threadid=3: thread exiting with uncaught exception (group=0x4001b390)
09-29 08:58:06.672: ERROR/AndroidRuntime(1552): Uncaught handler: thread main exiting due to uncaught exception
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.graphics.Bitmap.nativeCreate(Native Method)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.graphics.Bitmap.createBitmap(Bitmap.java:569)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:422)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.google.android.maps.ZoomHelper.beginZoom(ZoomHelper.java:186)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.google.android.maps.MapView$2.onScaleBegin(MapView.java:371)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.ScaleGestureDetector.onTouchEvent(ScaleGestureDetector.java:208)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.google.android.maps.MapView.onTouchEvent(MapView.java:646)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.View.dispatchTouchEvent(View.java:3709)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.app.Activity.dispatchTouchEvent(Activity.java:2068)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1708)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.os.Looper.loop(Looper.java:123)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at android.app.ActivityThread.main(ActivityThread.java:4595)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at java.lang.reflect.Method.invokeNative(Native Method)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at java.lang.reflect.Method.invoke(Method.java:521)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):     at dalvik.system.NativeStart.main(Native Method)

过去一个月来,我一直在解决这个问题。 我在代码中解决了这个问题的方式是强制GC清除我已包装在WeakReferences中的未引用位图。 这种方法可能不适用于你,因为你上面粘贴的崩溃似乎源于MapView。 无论如何,尝试在代码中的关键位置上调用一些System.gc()调用,并观察系统日志以查看GC_EXPLICIT消息是否指示释放大量对象/字节。 在我正在处理的代码中,我不得不在我的Adapter.getView()方法的末尾添加一个System.gc(),以确保在下次调用getView()时清除未使用的位图。 这种方法似乎已经大大减少了我可怕的java.lang.OutOfMemoryError的运行:位图大小超过VM预算崩溃。


我一直有这个EXACT相同的问题,我用一些System.GC调用腌制代码,它似乎有一点帮助,但这仍然发生。

我还遇到另一个问题,这可能与地图翻转时的相关性有关,并且在缩放时会随机全部出现。 这往往会在碰撞之前发生。

这一切都只发生在HTC Desire上,我相信它与Nexus One是一样的手机。 (在许多方面也类似EVO,它也受到它的影响)。

注意:在我们的Arc-S,Galaxy V1,AVD模拟器和Asus平板电脑上它工作得很好。


我遇到了同样的问题,请在应用程序标签下的清单文件中添加以下行

android:largeHeap = true。 这对我有效

链接地址: http://www.djcxy.com/p/3021.html

上一篇: Out of memory error when using Google Maps API

下一篇: Avoiding pollution of globals via iframe script loader?