2011-04-01 55 views
7

在我的應用程序用戶選擇圖像和程序讓用戶對圖像進行更改。由於有很多不同的Android設備,我的程序在一些堆大小較小的設備上崩潰。我想計算用戶手機的最佳尺寸,以免虛擬機預算崩潰。我添加了「Picsay Pro」的屏幕截圖,它正在製作我正在尋找的內容。我知道「BitmapFactory.Options」,我唯一的問題是找到一種方法來決定圖像尺寸,因爲VM預算不會讓應用程序崩潰。如何選擇最佳圖像大小不超過虛擬機預算?

enter image description here

回答

12

計算的剩餘可用空間在手機上:

long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());

其中,

調用Runtime.getRuntime ().maxMemory() - 返回總堆限制大小(以字節爲單位)。

Debug.getNativeHeapAllocatedSize() - 返回應用程序已使用的數據量(以字節爲單位)。

計算你用這個公式使用位圖的大小,

long Bytes_allocated = (height of the Image) * (width of the Image) * 4;

比較freeMemoryBytes_allocated選擇適合您的應用程序此時,相應的大小。

1

其實我最終壓縮在手機上的圖像有兩個原因。一個是上傳速度,另一個是堆問題。你可以嘗試做類似的事情,或者至少發佈堆棧跟蹤!

0

到目前爲止,我還沒有找到任何可靠的方式來處理圖像大小vs可用內存。問題是內存變得非常快速碎片化,所以你可以有10 MB的空間,但沒有連續的2 MB空間。真正需要的是最大的可用空間的大小,但似乎沒有任何方法可以實現。更好的辦法是對內存進行碎片整理,但是也沒有這樣的功能。

如果您的可用內存小於映像,那麼如果您嘗試使用該映像,則可以確定它會崩潰,因此在使用它之前至少應該檢查一下它的優點。

2012年底的平板電腦現在擁有1920x1280的分辨率,現在我們需要20MB的連續內存來存放單張背景圖片!看起來其中一些平板電腦現在允許堆積高達256MB,但是雖然拋出更多虛擬機空間似乎解決了它,但我們確實需要內存碎片整理程序或預留空間的方法。

如果圖像大小沒有縮放或修改,並且每個更改的圖像大小相同,並且您的應用僅限於Android 3,則有一個技巧可能會有所幫助。0+:

Options opt2 = new BitmapFactory.Options(); 
opt2.inBitmap = mBitmap;  // reuse mBitmap to reduce out of memory errors 
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2); 

這將重新使用相同的內存區域mBitmap的圖像。

相關問題