2012-12-12 60 views
1

我有一个使用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: 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(); 
     } 
    } 

这里是我的onCreateView其初始化CON:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     con = container; 
     return inflater.inflate(R.layout.main_fragment,container, false); 
    } 

我不知道还有什么我能做的。

任何人都可以帮我解决这个问题吗?

感谢

+0

你正在你的应用程序中加载一些图像? – artsylar

+1

您的应用程序中有内存泄漏。安装MAT http://android-developers.blogspot.pt/2011/03/memory-analysis-for-android.html并检查哪些引用阻止GC收集对象。 – Luis

回答

2

尝试自己处理屏幕旋转,添加以下代码到活动

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 

,并添加以下到您的活动代码清单档案中的

机器人:configChanges = “orientation | keyboardHidden | screenSize”

+0

是的,我认为这个答案将解决问题。 – Sean

+2

阅读文档,自己处理方向更改是您应该做的最后一个可能的解决方案。所以,基本上在尝试之前尝试一切...... – WarrenFaith

+0

嗨,我做了一个内存分析,它基本上揭示了在byte []上使用大量空间。我进一步深入钻研,并为Bitmap对象分配了许多分配。 我实现了你的解决方案,它似乎工作得很好。我不明白为什么。你能解释为什么添加代码可以避免内存错误吗? 谢谢 – sam

1

始终让操作系统处理您的方向更改!

如果配置发生变化,您的活动将被重新创建,例如,方向改变。大部分内存泄漏的原因是存在一些异步操作,它会对您的视图持有(隐式/显式)引用,从而阻止您的视图被垃圾收集。例如,如果您使用CountDownTimer或非静态内部可运行。

相关问题