亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

android-創建位圖時出現內存不足異常

android-創建位圖時出現內存不足異常

白衣非少年 2019-11-04 10:27:04
第二次創建位圖后,出現以下錯誤:04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budgetthis._profileBitmap = Bitmap.createBitmap(_profileBitmap, xCoor,  yCoor, width, height);從日志:04-17 18:27:57.500: INFO/CameraCropView(3458): Original Photo Size: W 1536 x H 2048   04-17 18:28:06.170: INFO/CameraCropView(3458): xCoor: 291   04-17 18:28:06.170: INFO/CameraCropView(3458): yCoor: 430    04-17 18:28:06.170: INFO/CameraCropView(3458): Width: 952  04-17 18:28:06.170: INFO/CameraCropView(3458): Height: 952  由于圖像很大,我得到了錯誤。但是有趣的是,錯誤不會第一次發生,只有在第二次拍照時才發生,這使我相信此profileBitmap不會被破壞。我該如何清理?
查看完整描述

3 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

我有同樣的問題,并通過以下方式解決:


我的應用程序大小約為18MB,當我看到還有多少可用空間時,我感到震驚-654KB(在1GB RAM上?。R虼耍規缀鮿h除了項目中的幾乎所有圖像,并在首次啟動時從互聯網上下載了它們,并在需要時使用SD卡中的圖片。


要檢查您的應用使用的總內存/可用內存,請執行以下操作:


 Runtime.getRuntime().totalMemory();

 Runtime.getRuntime().freeMemory();

編輯:我忘記了主要的事情-在您的清單中添加應用程序標記之間的這一行:


android:largeHeap="true"


查看完整回答
反對 回復 2019-11-04
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

Android上的位圖存在內存異常的許多問題,其中許多是在stackoverflow上討論的。如果您遍歷現有問題,看看是否與現有問題之一匹配,那將是最好的選擇;否則,寫下導致您的情況有所不同的原因。

查看完整回答
反對 回復 2019-11-04
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

android位圖處理技巧


現在,這里是您可以遵循的提示,可以避免Android應用程序中的內存不足異常。


始終使用活動上下文而不是應用程序上下文。因為無法對應用程序上下文進行垃圾回收。并在活動結束時釋放資源。(對象的生命周期應與活動的生命周期相同)。

2?;顒咏Y束時。檢查HEAP DUMP(Android Studio中的內存分析工具)。


如果HEAP DUMP中已完成活動的對象中存在內存泄漏。查看您的代碼,找出導致內存泄漏的原因。


始終使用inSampleSize

現在inSampleSize是什么?借助inSampleSize,您實際上是在告訴解碼器不要抓取內存中的每個像素,而要抓取子樣本圖像。與原始圖像相比,這將導致較少數量的像素要加載到內存中。您可以告訴解碼器從原始圖像中抓取第4個像素或每2個像素。如果inSampleSize為4,則解碼器將返回一個Image,該Image是原始圖像中像素數的1/16。


那么您節省了多少內存?計算 :)


在加載到內存之前,請先閱讀“位圖尺寸”。


如何在將圖像加載到內存之前讀取位圖尺寸可以幫助您避免

內存不足錯誤?讓我們來學習


使用inJustBounds = true


這是一種技術的幫助,您可以在將其加載到內存之前獲取圖像尺寸


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

 options.inJustDecodeBounds = true;

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage,    options);

 int imageHeight = options.outHeight;

 int imageWidth = options.outWidth;

 String imageType = options.outMimeType;

上面的代碼片段不會提供任何圖像/位圖。對于位圖對象,它將返回null。但它肯定會返回該圖像的寬度和高度。這是R.id.myimage。


現在您有了Image的寬度和高度。您可以根據以下因素放大或縮小圖像:


用于顯示圖像的ImageView大小。

可用內存量。您可以使用ActivityManager和getMemoryClass檢查可用的內存量。

屏幕尺寸和設備密度。


使用適當的位圖配置

位圖配置是圖像的顏色空間/顏色深度。Android中的默認位圖配置為RGB_8888,每像素4個字節。


如果使用RGB_565顏色通道,則每個像素使用2個字節。相同分辨率的一半內存分配:)


將inBitmap屬性用于回收目的。


不要制作靜態Drawable Object,因為它不能被垃圾回收。


在清單文件中請求大堆。


如果您要執行大量圖像處理(內存密集型任務)或使用NDK(使用c,c ++進行本機開發),請使用多個過程


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 640 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號