Android 方向更改时出现内存不足错误
我有一个使用osmdroid mapactivity的应用程序 每次屏幕方向改变时,堆大小都会增加,并且在几个方向改变后,我会出现以下错误:Android 方向更改时出现内存不足错误,android,memory-leaks,screen-orientation,osmdroid,Android,Memory Leaks,Screen Orientation,Osmdroid,我有一个使用osmdroid mapactivity的应用程序 每次屏幕方向改变时,堆大小都会增加,并且在几个方向改变后,我会出现以下错误: 12-12 00:53:08.990: E/dalvikvm-heap(6712): Out of memory on a 262160-byte allocation. 12-12 00:53:08.990: I/dalvikvm(6712): "filesystem" prio=5 tid=46 RUNNABLE 12-12 00:53:08.990:
12-12 00:53:08.990: E/dalvikvm-heap(6712): Out of memory on a 262160-byte allocation.
12-12 00:53:08.990: I/dalvikvm(6712): "filesystem" prio=5 tid=46 RUNNABLE
12-12 00:53:08.990: I/dalvikvm(6712): | group="main" sCount=0 dsCount=0 obj=0x43057e08 self=0x571583c8
12-12 00:53:08.990: I/dalvikvm(6712): | sysTid=8674 nice=0 sched=0/0 cgrp=apps handle=1487255264
12-12 00:53:08.990: I/dalvikvm(6712): | schedstat=( 298265664 165380214 301 ) utm=25 stm=4 core=0
12-12 00:53:08.990: I/dalvikvm(6712): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
12-12 00:53:08.995: I/dalvikvm(6712): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
12-12 00:53:08.995: I/dalvikvm(6712): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389)
12-12 00:53:08.995: I/dalvikvm(6712): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:449)
12-12 00:53:08.995: I/dalvikvm(6712): at org.osmdroid.tileprovider.tilesource.BitmapTileSourceBase.getDrawable(BitmapTileSourceBase.java:93)
12-12 00:53:08.995: I/dalvikvm(6712): at org.osmdroid.tileprovider.modules.MapTileFilesystemProvider$TileLoader.loadTile(MapTileFilesystemProvider.java:142)
12-12 00:53:08.995: I/dalvikvm(6712): at org.osmdroid.tileprovider.modules.MapTileModuleProviderBase$TileLoader.run(MapTileModuleProviderBase.java:241)
12-12 00:53:08.995: I/dalvikvm(6712): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-12 00:53:08.995: I/dalvikvm(6712): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-12 00:53:08.995: I/dalvikvm(6712): at java.lang.Thread.run(Thread.java:856)
12-12 00:53:09.020: I/dalvikvm-heap(6712): Clamp target GC heap from 64.436MB to 64.000MB
12-12 00:53:09.050: I/dalvikvm-heap(6712): Forcing collection of SoftReferences for 262160-byte allocation
12-12 00:53:09.095: I/dalvikvm-heap(6712): Clamp target GC heap from 64.436MB to 64.000MB
我有一个包含两个片段的活动,这两个片段都扩展了一个抽象片段,这个抽象片段初始化了MapActivity
我读过很多有同样问题的人的帖子。我最终在抽象片段中实现了以下内容:
@Override
public void onDestroyView() {
super.onDestroyView();
unbindDrawables(con.findViewById(R.id.main_layout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
我不知道我还能做什么
谁能帮我解决这个问题
谢谢尝试自己处理屏幕旋转,将以下代码添加到活动中
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
并将以下内容添加到清单文件中的活动标记中
android:configChanges=“方向|键盘隐藏|屏幕大小”始终让操作系统处理您的方向更改
如果发生配置更改(例如方向更改),将重新创建您的活动。大多数内存泄漏的原因是,有一些异步操作持有对视图的(隐式/显式)引用,从而防止对视图进行垃圾收集。例如,如果使用倒计时或非静态内部可运行。是否在应用程序中加载一些图像?应用程序中存在内存泄漏。安装MAT并检查哪些引用阻止GC收集对象。阅读文档,自己处理方向更改是您应该做的最后一个可能的解决方案。所以基本上在你这么做之前试着做其他的事情…嗨,我做了一个内存分析,基本上揭示了字节[]上使用了大量的空间。我进一步深入研究,发现有许多位图对象的分配。我实施了你的解决方案,看起来效果很好。我不明白为什么。你能解释一下为什么添加代码可以避免内存错误吗?感谢当方向改变时,活动被破坏并重新创建,内存可能会泄漏。通过覆盖onConfigurationChanged,不会重新创建活动,您可以自己处理更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}