我正在尝试在一些嵌套元素中创建一个MapView(当前没有任何叠加层)。
它基本上类似于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}
你知道为什么会这样,我能做些什么来摆脱它?我不能把它从那个观点中解脱出来,因为它是我需要它的地方。
谢谢!
答案 0 :(得分:11)
我发现了一些非常简单的东西。
将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>
我得到以下stacktrace:
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)
这是解决方案:
<?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>
问候, 马可
答案 1 :(得分:6)
我也有这个问题,当你试图指定mapview的确切尺寸时会发生这种情况。将其中一个维度设置为fill_parent或wrap_content,让另一个维度为您想要的任何维度。这应该可以解决问题。
答案 2 :(得分:2)
我真的没看到你在哪里得到一个OutOfMemoryError?我确实看到了这个:
Caused by: java.lang.IllegalArgumentException: MapViews can only be created inside instances of MapActivity.
其中说你只能在扩展MapActivity的类中创建一个MapView,这意味着你不这样做?
答案 3 :(得分:2)
看看以下主题:
Issue 2181:Memory leak in system when using MapView
似乎这是MapActivity内部的东西。这个帖子已经存在了两年多了,并没有被报道为固定...
编辑:尝试了那里描述的解决方案,它引导我找到类似的解决方案:
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
}
答案 4 :(得分:2)
steemcb是正确的,但遗憾的是MapView
there is also a bug导致这种情况发生,即使您的布局很好。我得到的堆栈跟踪与您的完全相同。它是一个脆弱的组件,布局类型的微小变化会导致它意外中断,特别是如果它被包裹在ScrollLayout
中。
Android项目中的任何人都没有解决过这个问题。
答案 5 :(得分:1)
实际上是将MapView放在Scrollview中引起的。有关详细信息,请参阅android MapView always causes an OutOfMemoryError in nested elements。
答案 6 :(得分:0)
实际上它是由Scrollview创建一个缓冲区来包含滚动条每个可能位置的视图,以实现快速平滑的滚动。由于在测量阶段加载切片时MapView非常大,因此ScrollView创建的结果缓冲区可能很大(大约128 M)。除非您将模拟器设置为具有超过256 M的ram和堆空间,否则它将因内存不足错误而失败。您可以将模拟器设置为具有512M的ram和堆空间,但是您的应用程序会在任何RAM小于512M或堆空间不足的设备上崩溃。最好的办法是从ScrollView中删除MapView。