Android MapView总是在嵌套元素中导致OutOfMemoryError

我试图创build一个MapView(目前没有任何重叠)内embedded的一些元素。 它基本上就像ScrollView -> RelativeLayout -> RelativeLayout -> MapView

  <com.google.android.maps.MapView android:id="@+id/mapview" android:layout_width="420px" android:layout_height="300px" android:clickable="false" android:apiKey="key"/> 

对我来说似乎很好。 在启动时我没有做任何事情,但总是会导致以下情况:

 04-04 13:38:33.910: WARN/dalvikvm(13628): threadid=1: thread exiting with uncaught exception (group=0x40015560) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): FATAL EXCEPTION: main 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): java.lang.OutOfMemoryError 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android_maps_conflict_avoidance.com.google.googlenav.map.Map.resize(Map.java:1368) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android_maps_conflict_avoidance.com.google.googlenav.map.Map.resize(Map.java:1337) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at com.google.android.maps.MapView.onMeasure(MapView.java:590) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1072) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.ScrollView.onMeasure(ScrollView.java:296) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.View.measure(View.java:8313) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.os.Handler.dispatchMessage(Handler.java:99) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.os.Looper.loop(Looper.java:123) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at android.app.ActivityThread.main(ActivityThread.java:3647) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at java.lang.reflect.Method.invokeNative(Native Method) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at java.lang.reflect.Method.invoke(Method.java:507) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 04-04 13:38:33.996: ERROR/AndroidRuntime(13628): at dalvik.system.NativeStart.main(Native Method) 04-04 13:38:34.027: WARN/ActivityManager(6000): Force finishing activity package/.home 04-04 13:38:34.527: WARN/ActivityManager(6000): Activity pause timeout for HistoryRecord{405336d0 package/.home} 

你有什么想法,为什么这是我能做些什么来摆脱它? 我不能把它看成是我需要的地方。

谢谢!

Solutions Collecting From Web of "Android MapView总是在嵌套元素中导致OutOfMemoryError"

我发现一些很简单的东西。

只需将MapView放置在FrameLayout中即可。 让FramgeLayout成为wrap_content | wrap_content和一切都很好:)

这一个失败:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <view android:layout_width="100dip" android:layout_height="90dip" class="com.google.android.maps.MapView" android:apiKey="@string/API_KEY" android:clickable="true" /> </RelativeLayout> </ScrollView> </RelativeLayout> 

我得到以下堆栈跟踪:

 java.lang.OutOfMemoryError at com.google.googlenav.map.Map.resize(Unknown Source) at com.google.android.maps.MapView.onMeasure(MapView.java:554) at android.view.View.measure(View.java:8172) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362) at android.view.View.measure(View.java:8172) at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:989) at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) at android.widget.ScrollView.onMeasure(ScrollView.java:286) at android.view.View.measure(View.java:8172) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362) at android.view.View.measure(View.java:8172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3140) at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) at android.view.View.measure(View.java:8172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3140) at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) at android.view.View.measure(View.java:8172) at android.view.ViewRoot.performTraversals(ViewRoot.java:805) at android.view.ViewRoot.handleMessage(ViewRoot.java:1744) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:144) at android.app.ActivityThread.main(ActivityThread.java:4937) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) at dalvik.system.NativeStart.main(Native Method) 

这里的解决scheme:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <view android:layout_width="100dip" android:layout_height="90dip" class="com.google.android.maps.MapView" android:apiKey="@string/API_KEY" android:clickable="true" /> </FrameLayout> </RelativeLayout> </ScrollView> </RelativeLayout> 

问候,马可

我也有这个问题,当你试图指定一个mapview的确切尺寸时,就会发生这个问题。 将其中一个维度设置为fill_parent或wrap_content,然后让其他维度成为您想要的维度。 这应该够了吧。

我真的不知道你在哪里得到一个OutOfMemoryError? 我看到这个:

 Caused by: java.lang.IllegalArgumentException: MapViews can only be created inside instances of MapActivity. 

哪个说你只能在一个扩展MapActivity的类中创build一个MapView,这意味着你不这样做?

看看下面的线程:

问题2181:使用MapView时系统中的内存泄漏

似乎这是MapActivity内部的东西。 这个线程已经存活了两年多了,而且没有被报告为固定的…

编辑:尝试在那里描述的解决scheme,它导致我到一个类似的解决scheme:

 try { Field mConfigField = MapActivity.class.getDeclaredField("mConfig"); mConfigField.setAccessible(true); Object mConfig = mConfigField.get(this); if (null != mConfig) { Field mConfigContextField = mConfig.getClass().getDeclaredField("context"); mConfigContextField.setAccessible(true); mConfigContextField.set(mConfig, null); mConfigField.set(this, null); } } catch (Exception ex) { // Do error handling } 

steemcb是正确的,但不幸的是,在MapView中也有一个错误 , 即使你的布局是好的,也会导致这个错误发生 我得到了和你一样的堆栈跟踪。 这是一个脆弱的组件,布局types的小改动会导致意外中断,特别是如果它被包装在ScrollLayout

Android项目的任何人都尚未解决这个问题。

实际上它是通过将MapView放置在滚动视图中引起的。 查看android MapView总是会导致嵌套元素中出现OutOfMemoryError以获取更多信息。

其实这是由Scrollview创build一个缓冲区来包含在滚动条的每个可能的位置的视图,以实现快速和平滑的滚动。 由于在测量阶段加载图块时MapView非常大,因此由ScrollView创build的缓冲区可能很大(大约128M)。 除非您将模拟器设置为具有超过256 M的RAM和堆空间,否则将会出现内存不足错误。 你可以设置你的模拟器具有512M的RAM和堆空间,但是你的应用程序会崩溃在RAMless于512M或堆空间不足的设备上。 最好的办法是从ScrollView中删除MapView。