日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android outofmemory 原理及解决方案

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android outofmemory 原理及解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


一、問題描述:Android下的相機在獨自使用時,拍照沒有問題,通過我們的代碼調用時,也正常,但是更換了不同廠商的平板,ROM由Android4.0變成了Android4.1后,拍照出現了OutOfMemory異常,程序中斷退出。如何解決這個問題呢?

二、先看看我們之前所寫的代碼

1) 調用系統相機(沒有懷疑這里出錯,代碼略)

2)顯示圖片

mImageView = (ImageView) findViewById(R.id.imageView);

fileName = mData.get(0).toString();

Bitmap bitmap = BitmapFactory.decodeFile(fileName);

mImageView.setImageBitmap(bitmap);

三、問題分析

經過調試排查,發現我們的bitmap圖片達到3M,如果是3K則不出錯。啥原理呢?

四、先來看看,Android的內存溢出是如何發生的?

Android的虛擬機是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的機器為24M。因此我們所能利用的內存空間是有限的。如果我們的內存占用超過了一定的水平就會出現OutOfMemory的錯誤。

為什么會出現內存不夠用的情況呢?我想原因主要有兩個:

程序本身運行就占有一定的內存,而程序在使用較大的bitmap時,又需要一個更大的內存空間。控制不當,就容易造成內OutOfMemory

五、Android對應用程序內存的限制

android不同設備單個進程可用內存是不一樣的,可以查看/system/build.prop文件。

dalvik.vm.heapsize=24m

dalvik.vm.heapgrowthlimit=16m

可以自行對這個限制進行更改,當然需要先對設備進行ROOT


六、加載位圖原理分析

1BitmapFactory提供了幾種解碼方式(decodeByteArray(), decodeFile(), decodeResource()等等),以便從多種資源中創建一個Bitmap(位圖)對象。可以根據你的圖片數據來源選擇最合適的解碼方式。這些方法視圖為構造Bitmap對象分配內存,因此很容易導致OutOfMemory(OOM)異常。每一種解碼方式都有額外的特征,你可以通過BitmapFactory.Options類類指定解碼方法。

2、盡量不要使用setImageBitmapsetImageResourceBitmapFactory.decodeResource直接使用圖片路徑來設置一張大圖,因為這些函數在完成decode后,最終都是通過java層的createBitmap來完成的,需要消耗更多內存。改用先通過BitmapFactory.decodeStream方法,創建出一個bitmap,再調用上述方法將其設為ImageView sourcedecodeStream最大的秘密在于其直接調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。下面是使用InputStream加載圖片的幾種方法:

方法一、加載資源文件中指定的圖片

InputStream is = getResources().openRawResource(R.drawable.temp);

方法二、加載assest目錄下的圖片

AssetManager asm=getAssetMg();

InputStream is=asm.open(name);//name:圖片的名稱

方法三、加載SD卡目錄下的圖片

String path =Environment.getExternalStorageDirectory().toString()+ "/DCIM/device.png";

inputStream is = new FileInputStream(path)

七、解決方案

private ImageView preview;

//1.加載位圖

String path = Environment.getExternalStorageDirectory().toString()+"/DCIM/device.png";

inputStream is = new FileInputStream(path)

//2.為位圖設置100K的緩存

BitmapFactory.Options opts=new BitmapFactory.Options();

opts.inTempStorage = new byte[100 * 1024];

//3.設置位圖顏色顯示優化方式

//ALPHA_8:每個像素占用1byte內存(8位)

//ARGB_4444:每個像素占用2byte內存16位)

//ARGB_8888:每個像素占用4byte內存32位)

//RGB_565:每個像素占用2byte內存16位)

//Android默認的顏色模式為ARGB_8888,這個顏色模式色彩最細膩,顯示質量最高。但同樣的,占用的內存//也最大。也就意味著一個像素點占用4個字節的內存。我們來做一個簡單的計算題:3200*2400*4 bytes //=30M。如此驚人的數字!哪怕生命周期超不過10sAndroid也不會答應的。

opts.inPreferredConfig = Bitmap.Config.RGB_565;

//4.設置圖片可以被回收,創建Bitmap用于存儲Pixel的內存空間在系統內存不足時可以被回收

opts.inPurgeable = true;

//5.設置位圖縮放比例

//widthhight設為原來的四分一(該參數請使用2的整數倍),這也減小了位圖占用的內存大小;例如,一張//分辨率為2048*1536px的圖像使用inSampleSize值為4的設置來解碼,產生的Bitmap大小約為//512*384px。相較于完整圖片占用12M的內存,這種方式只需0.75M內存(假設Bitmap配置為//ARGB_8888)

opts.inSampleSize = 4;

//6.設置解碼位圖的尺寸信息

opts.inInputShareable = true;?

//7.解碼位圖

Bitmap btp =BitmapFactory.decodeStream(is,null, opts); ???

//8.顯示位圖

preview.setImageBitmap(bitmap);

總結

以上是生活随笔為你收集整理的android outofmemory 原理及解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。