最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android處理大圖避免OOM的完整方案

 更新時(shí)間:2025年06月06日 09:21:40   作者:時(shí)小雨  
在 Android 中處理大圖時(shí),內(nèi)存占用是關(guān)鍵問(wèn)題,由于 Bitmap 的像素?cái)?shù)據(jù)直接存儲(chǔ)在內(nèi)存中,一張高分辨率圖片(如 4000x3000)可能占用約 48MB(ARGB_8888 格式下,每個(gè)像素占 4 字節(jié)),以下是避免 OOM 的完整方案,需要的朋友可以參考下

1. 計(jì)算合適的縮放比例

使用 BitmapFactory.Options 的 inSampleSize 對(duì)圖片進(jìn)行采樣壓縮:

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int width = options.outWidth;
    final int height = options.outHeight;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        final int halfWidth = width / 2;
        final int halfHeight = height / 2;
        while ((halfWidth / inSampleSize) >= reqWidth 
                && (halfHeight / inSampleSize) >= reqHeight) {
            inSampleSize *= 2;
        }
    }
    return inSampleSize;
}

2. 分步加載圖片

  • 步驟 1:僅讀取圖片尺寸(不分配內(nèi)存)
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options);
int imageWidth = options.outWidth;
int imageHeight = options.outHeight;
  • 步驟 2:動(dòng)態(tài)計(jì)算縮放比例并加載
options.inJustDecodeBounds = false;
options.inSampleSize = calculateInSampleSize(options, targetWidth, targetHeight);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options);

3. 優(yōu)化內(nèi)存配置

使用更低的像素格式(如不需要透明度):

options.inPreferredConfig = Bitmap.Config.RGB_565; // 每個(gè)像素占 2 字節(jié)(內(nèi)存減半)

禁用自動(dòng)縮放(避免系統(tǒng)根據(jù)屏幕密度調(diào)整大?。?/p>

options.inScaled = false;

4. 按需加載局部區(qū)域(超大圖場(chǎng)景)

使用 BitmapRegionDecoder 分塊加載:

InputStream is = getAssets().open("large_image.jpg");
BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(is, false);
Rect rect = new Rect(startX, startY, startX + width, startY + height);
Bitmap bitmap = decoder.decodeRegion(rect, options);

5. 及時(shí)回收資源

在 onDestroy() 或不再需要 Bitmap 時(shí)主動(dòng)回收:

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

避免在 onDraw() 中頻繁創(chuàng)建 Bitmap(利用緩存或復(fù)用機(jī)制)。

6. 使用第三方庫(kù)(推薦)

Glide:自動(dòng)處理圖片縮放、內(nèi)存/磁盤緩存、生命周期管理。

Glide.with(context)
     .load("path/to/image")
     .override(targetWidth, targetHeight)
     .into(imageView);

Picasso:類似 Glide,提供簡(jiǎn)潔的 API 管理大圖。

7. 配置大堆或硬件加速

在 AndroidManifest.xml 中為 Activity 添加 largeHeap="true"(臨時(shí)緩解,不推薦長(zhǎng)期依賴):

<application android:largeHeap="true">

啟用硬件加速(在部分場(chǎng)景下減少內(nèi)存壓力):

<activity android:hardwareAccelerated="true" />

關(guān)鍵公式:內(nèi)存估算

內(nèi)存占用 = 圖片寬度 * 圖片高度 * 每像素字節(jié)數(shù)
例如:4000x3000 的 ARGB_8888 圖片 = 4000 * 3000 * 4B ≈ 48MB

通過(guò)上述策略,可顯著降低內(nèi)存占用,有效避免 OOM。實(shí)際開(kāi)發(fā)中優(yōu)先使用 Glide/Picasso 等成熟庫(kù),減少手動(dòng)處理風(fēng)險(xiǎn)。

以上就是Android處理大圖避免OOM的完整方案的詳細(xì)內(nèi)容,更多關(guān)于Android處理大圖避免OOM的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

达日县| 漾濞| 常熟市| 樟树市| 永新县| 沛县| 泽库县| 衢州市| 宝鸡市| 瑞昌市| 安多县| 县级市| 治县。| 滨州市| 仁布县| 许昌市| 泽库县| 将乐县| 牙克石市| 延寿县| 焦作市| 尉犁县| 平江县| 和龙市| 吐鲁番市| 汕尾市| 秦皇岛市| 布拖县| 鹤岗市| 四子王旗| 东台市| 正安县| 锦屏县| 石棉县| 富川| 广西| 庆阳市| 安平县| 桃园市| 突泉县| 获嘉县|