當前位置:首頁 » 安卓系統 » android載入圖片溢出

android載入圖片溢出

發布時間: 2023-05-30 16:04:16

『壹』 android中用viewflipper來放大量圖片時,內存溢出,求助

創建太多圖片而不注意回收容易導致內存溢出啊點陣圖很占內存的,而且占的好像是native內存建議創建圖片用弱引用包裝
或者
自己回收一下

『貳』 如何解決Android內存溢出

模擬器RAM比較小,只有8M內存,當我放入的大量的圖片(每個100多K左右),就出現上面的原因。由於每張圖片先前是壓縮的情況。放入到Bitmap的時候,大小會變大,導致超出RAM內存,具體解決辦法如下://解決載入圖片內存溢出的問題
//Options只保存圖片尺寸大小,不保存圖片到內存
BitmapFactory.Optionsopts=newBitmapFactory.Options();
/*縮放的比例,縮放是很難按准備的比例進行縮放的,其值表明縮放的倍數,SDK中建議其值是2的指數值,值越大會導致圖片不清晰*/
opts.inSampleSize=4;
//回收bmp.recycle();還可以用到優化Dalvik虛擬機的堆內存分配對於Android平台來說,其託管層使用的DalvikjavaVM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型游戲或耗資源的應用中可能考慮手動干涉GC處理,使用dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程序堆內存的處理效率。當然具體原理我們可以參考開源工程,這里我們僅說下使用方法:privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;在程序onCreate時就可以調用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);Android堆內存也可自己定義大小對於一些Android項目,影響性能瓶頸的主要是Android自己內存管理機制問題,除了優化Dalvik虛擬機的堆內存分配外,我們還可以強制定義自己軟體的對內存大小,我們使用Dalvik提供的dalvik.system.VMRuntime類來設置最小堆內存為例:privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//設置最小heap內存為6MB大小。當然對於內存吃緊來說還可以通過手動干涉GC去處理

『叄』 如何定位和解決android的內存溢出問題

進公司的第一個項目就遇到了一個比較難纏的客戶,不過總算對付過去了。在第一個項目中由於app載入的圖片、報表比較多,所以經常報出內存溢出的錯誤,很是頭疼。不過在project leader的帶領下,基本算是解決了。在此感謝一下my leader,Samuel.Cai辛苦了。哈哈......
以下是一些總結,ps:從我leader那邊搞過來的,和大家分享一下,哈哈
1. 當項目中包含大量圖片,或者圖片過大,可能會oom

方法1 : 等比例縮小圖片

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

方法2 : 對圖片採用軟引用,及時地進行recyle()操作

SoftReference<Bitmap> bitmap;
bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}

方法3 : 對復雜的listview進行合理設計與編碼:
1. 注意重用Adapter裡面的 convertView 以及holder機制的運用 ----- 參考資料: api demo list 14. Efficient Adapter

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];
for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}
v.setTag(holder);
} else {



2. 上述方法嘗試還未成功,可用 lazy loading data ----- 參考資料:api demo list 13

方法4 : 單個頁面,橫豎屏切換N次後 OOM
1. 看看頁面布局當中有沒有大的圖片,比如背景圖之類的。去除xml中相關設置,改在程序中設置背景圖(放在onCreate()方法中):
Drawable bg = getResources().getDrawable(R.drawable.bg);
XXX.setBackgroundDrawable(rlAdDetailone_bg);
在Activity destory時注意,bg.setCallback(null); 防止Activity得不到及時的釋放

2. 跟上面方法相似,直接把xml配置文件載入成view 再放到一個容器里,然後直接調用 this.setContentView(View view);方法

避免xml的重復載入

方法5 : 在頁面切換時盡可能少地重復使用一些代碼,比如:重復調用資料庫,反復使用某些對象等等......

方法6 :Android堆內存也可自己定義大小 和 優化Dalvik虛擬機的堆內存分配
注意若使用這種方法:project build target 只能選擇 <= 2.2 版本,否則編譯將通不過。 所以不建議用這種方式

private final static int CWJ_HEAP_SIZE= 6*1024*1024;
private final static float TARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

『肆』 android bitmap 從網路獲取圖片並處理問題 溢出

在 Java中,JavaVM擁有自動管理內存的功能,Java的GC能夠進行垃圾回收,但是如果ImageView使用過多的Bitmap的話,經常會報OOM(內存溢出)。

造成內存溢出及解決方案:

  1. 使用BitmapFactory.decodeStream替代createBitmap方法

    原因是該方法直讀取圖片位元組,調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap。

  2. 使用壓縮讀取技術

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(imageSdUri, options);

final int height = options.outHeight;

final int width = options.outWidth;

options.inSampleSize = 1;

int w = 320;

int h = 480;

h = w*height/width;//計算出寬高等比率

int a = options.outWidth/ w;

int b = options.outHeight / h;

options.inSampleSize = Math.max(a, b);

options.inJustDecodeBounds = false;

Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);


3.及時釋放Bitamp
Bitmap對象在不使用時,我們應該先調用recycle()釋放內存,然後才它設置為null.雖然recycle()從源碼上看,調用它應該能立即釋放Bitmap的主要內存,但是測試結果顯示它並沒能立即釋放內存。但是我它應該還是能大大的加速Bitmap的主要內存的釋放。

『伍』 Android內存溢出問題

一、內存溢出 現在的智能手機內存已經足夠大,但是對於一個應用程序來說智能手機當中稀缺的內存,仍然是應用程序的一大限制。在Android應用程序開發當中,最常見的內存溢出問題(OOM)是在載入圖片時出現的,尤其是在不知道圖片大小的情況下。 潛在的內存溢出操作主要包括以下幾點: 1、從網路當中載入用戶特定的圖片。因為直搭譽到我們在下載圖片的時候我們才知道圖片的大小。 2、向Gallery載入圖片。因為現在智能手機的攝像頭有很高的解析度,在載入圖片的時候需要最圖片進行處理,然後才能正常的使用。 請注意一點,Android系統是從系統全局的觀念來分配內存以載入圖片的,這就意味著,即使你的應用有足夠大的內存可用,內存溢出問題(out of memroy,OOM)仍然可能出現,因為所有的應用共享一個載入圖片的內存池(我們使用BitmapFactory進行解析)。 二、解決內存溢出問題 原文(Downsampling為了好理解,解釋為,程序知判段A)。程序A通過調整像素,同時使其均衡化來降低圖片的解析度。因為不管問題圖片是因為太大而不能再手機上正常顯現,這個圖片都會縮短其寬度以在ImageView當中顯示,當圖片在ImageView當中顯示時,我們會因為載入一些沒有必要的原始圖片而浪費掉內存。 因此,更加有效沖胡的載入圖片的時機是在其初始化處理的時候。 以下是處理代碼: 1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){2:3: BitmapFactory.Options options = new BitmapFactory.Options(); 14: options.inSampleSize = ssize;15:16: Bitmap bm = null;17: try{18: bm = decode(path, data, options); 19: }catch(OutOfMemoryError e){ 39: result = result * 2;40:41: }42:43: return result;44: }三、AQuery當在Android應用程序開發當中使用AQuery組件時,處理這個問題會變的更加的簡單。

熱點內容
照片傳到g6的存儲卡 發布:2025-02-10 09:29:02 瀏覽:901
非加密公章 發布:2025-02-10 09:09:52 瀏覽:620
京東登錄密碼如何清除 發布:2025-02-10 09:07:41 瀏覽:689
dns伺服器地址192 發布:2025-02-10 09:07:39 瀏覽:661
redis緩存實現 發布:2025-02-10 09:01:26 瀏覽:710
後台登錄腳本 發布:2025-02-10 08:56:11 瀏覽:658
我的辣雞賬號和密碼是多少 發布:2025-02-10 08:55:37 瀏覽:690
超父演算法 發布:2025-02-10 08:43:05 瀏覽:910
電腦主機配置需要哪些硬體 發布:2025-02-10 08:22:52 瀏覽:706
平板太卡換存儲卡有用嗎 發布:2025-02-10 08:14:16 瀏覽:828