2009-12-23 56 views
4

我正在開發一個android應用程序,當我閱讀所有內容併爲自己學習時,我無法同時在屏幕上顯示很多圖像,否則我會得到一個異常。java.lang.OutOfMemoryError:位圖大小超過VM預算 - android - 多少圖片?

問題是圖像中有多少圖像或多少KB,或屏幕上同時有多少佈局/圖像。

我知道這不是唯一影響記憶的東西,但我正在尋找一個數字,所以我可以圍繞它進行規劃。

感謝

丹尼爾


編輯:

我剛剛發現這個在Android開發人員網站(http://developer.android.com/resources/articles/future-proofing.html

技術來避免,#3:使用佈局舷外展望

由於View中的更改基礎設施不合理,超過10個左右(或超過10個)或廣泛(超過30個)佈局中的視圖層次現在可能導致崩潰。這對於過於複雜的佈局來說總是有風險的,但是在暴露這個問題時,你可以認爲Android 1.5比1.1好。大多數開發人員不需要擔心這一點,但是如果你的應用程序的佈局非常複雜,那麼你就需要對其進行節食。您可以使用更高級的佈局類(如FrameLayout和TableLayout)來簡化佈局。

我想這可能是我的問題。

當它說'廣泛'時,它是在最後一級上說的嗎?

感謝

丹尼爾

+1

相關孩子的:http://stackoverflow.com/questions/1949066/java-lang-outofmemoryerror-bitmap-size-exceeds- vm-budget-android – 2009-12-23 20:41:33

+0

如果你不得不問,你買不起。 – 2009-12-23 20:42:27

回答

2

這個答案有兩個部分

1)它沒有多少圖像的屏幕了,但是在完成活動

2)(Future-Proofing Your App

技術的時候是在清理了一切小心避免#3:過度使用佈局

由於視圖渲染基礎設施的變化,現在可能會出現佈局中不合理深度(超過10個)或寬泛(超過30個)視圖層次結構導致崩潰。這對於過於複雜的佈局來說總是有風險的,但是在暴露這個問題時,你可以認爲Android 1.5比1.1好。大多數開發人員不需要擔心這一點,但是如果你的應用程序的佈局非常複雜,那麼你就需要對其進行節食。您可以使用更高級的佈局類(如FrameLayout和TableLayout)來簡化佈局。

丹尼爾

1

的內存量相同也可以不同,你必須玩的量取決於什麼其他的系統在時間做。你最好的選擇是,如果你能幫到你的話,甚至不會使系統內存不足。你在做什麼,你需要在屏幕上的許多圖像?

+0

是的,我在屏幕上有很多圖片,它一次又一次崩潰如何解決它。 – 2013-03-06 06:53:53

0

我碰到的工作同樣的問題,我沒有爲它找到一個解決方案。

應用崩潰調用反覆的createImage(),通一個OutOfMemoryException之後。我的猜測是,它不是由Activity或Context泄漏引起的,因爲我的應用在遇到此問題時總是處於活動狀態。

我試着調試堆,看看是否有什麼supicious,但沒有獲得可以將位圖存儲空間(我試過在G1 1.6,也許1.5)。所以不知道發生了什麼事情(對此有任何可能的解決方案?)。

我不能肯定會有什麼原因,可能存在內存泄漏或內存碎片問題?

幫助表示讚賞!

謝謝。

Guillaume

1

這件事取決於手機的HEAP大小。 所以如果你的應用程序獲得更多的堆,那麼手機提供,那麼它可能會造成一個問題。

新一代機器人設備包含。這裏是一些

HTC野火(2.2.1)= 16MB的列表。
HTC Wildfire S(2.3.5)= 20MB。
HTC Salsa(2.3.3)= 20MB。
HTC Desire(2.3.3)= 32MB。
HTC Desire S(2.3.5)= 32MB。
三星Galaxy S GT-I9000(2.2)= 48MB。
Samsung Galaxy R GT-I9103(2.3.5)= 64MB。
三星Galaxy Y GT-S5360(2.3.5)= 64MB

所以沒有它的certan解決方案,但你可以嘗試優化位圖大小。例如 使用它後回收位圖。或者從的採樣大小再拍使用bitmapFectory deoeed。

如果您使用的是仿真器,那麼你可以創建一個包含多個堆大小在您的AVD管理爲VM堆大小= 32或最多添加新的額外的硬件配置設備。

+1

這只是一個模擬器,但不適用於真正的設備,所以它不是一個解決方案 – 2010-11-25 14:11:46

+0

@DanielBenedykt你是對的,看看我編輯它 – dhams 2012-05-18 05:21:37

7

一,我發現開發Android應用程序最常見的錯誤之一是

java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget錯誤。

我在改變方向後使用大量位圖的活動中經常發現此錯誤:活動被銷燬,再次創建,並且佈局從消耗可用於位圖的VM內存的XML中「膨脹」。

上一個活動佈局的位圖由於垃圾收集器已交叉引用其活動而未正確釋放。經過多次實驗,我發現了一個很好的解決方案。

首先,設置在您的XML佈局的父視圖的ID屬性:

<?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" 
    android:id="@+id/RootView" 
    > 
    ... 

然後,在您的活動的onDestroy()方法,調用unbindDrawables()方法傳遞refence到母體視圖,然後做一個System.gc()的

@Override 
    protected void onDestroy() { 
    super.onDestroy(); 

    unbindDrawables(findViewById(R.id.RootView)); 
    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(); 
     } 
    } 

這unbindDrawables()方法遞歸地探討了看法樹:

  • 上刪除所有的背景回調可繪製
  • 刪除每一個ViewGroup
+0

你的邏輯爲我解決了內存不足的例外...... 。非常感謝分享這樣一個偉大的邏輯 – 2012-10-09 12:12:53

相關問題