2012-02-12 162 views
0

我有一個問題。我在網站上進行了快速搜索,但沒有找到答案。 我們開發運行Android 2.2及更高版本的應用程序。對於視圖定製我們使用許多圖形內容,在這樣的方式使用:android中的可繪製資源管理

<LinearLayout ... 
    android:background="@drawable/some_drawable"/> 

我們使用地圖也與在存儲許多數據處理和我們的應用程序有一個沉甸甸的。在頂級設備上,它的工作非常棒,但在另一些設備上,我們在使用我們的應用程序幾分鐘後就發現了OutOfMemory異常。這看起來像我們有內存泄漏。 我試圖減少我們的應用程序的內存使用情況。問題,我們是否需要人工清潔資源來破壞我們的活動:刪除可查看的視圖或系統爲我們製作的視圖?

+0

如果您使用大量的高分辨率的位圖/可繪製將被縮放,這將消耗大量的內存。這是特定活動中的問題嗎?也許你在哪裏提出了一個列表視圖中有很多位圖? – 2012-02-12 12:53:25

回答

3

我在我的應用程序中也遇到了這個問題。如果在一個活動中使用了很多位圖,則會引發OutOfMemoryError,其中包含縮放和/或其他位圖操作。我所做的是將下面的代碼添加到我的活動中,這似乎使問題出現頻率降低(它不能很好地解決問題),並且現在應用程序在合理低端手機上運行時沒有錯誤。

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    // explicitly release media player 
    if(viewObjectInfo != null) 
     viewObjectInfo.releaseMediaPlayer(); 
    //explicitly release all drawables and call GC 
    unbindDrawables(findViewById(R.id.main)); 
    System.gc(); 
} 

/** 
* Unbinds all drawables in a given view (and its child tree). 
* 
* @param findViewById  Root view of the tree to unbind 
*/ 
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)); 
     } 
     try 
     { 
      ((ViewGroup) view).removeAllViews(); 
     } 
     catch(UnsupportedOperationException ignore) 
     { 
      //if can't remove all view (e.g. adapter view) - no problem 
     } 
    } 
} 
+0

'unbindDrawables(findViewById(R.id.main));'應該是'unbindDrawables(findViewById(R.layout.main));'? – Si8 2013-08-27 18:24:49

+0

如果我想要解除佈局中的所有圖像以釋放資源,直到再次調用佈局,該怎麼辦? – Si8 2013-08-27 18:33:30

+0

@ SiKni8對於你的第一個評論,我用'R.id.main' - 它得到了視圖,而不是佈局 - 雖然佈局也可能工作。對於你的第二個,不要解除一切 - 只要檢查它是什麼類型的視圖。 – 2013-08-27 19:15:55