2012-12-12 105 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或非靜態內部可運行。

相關問題