3 回答

TA貢獻1836條經驗 獲得超5個贊
我有同樣的問題,并通過以下方式解決:
我的應用程序大小約為18MB,當我看到還有多少可用空間時,我感到震驚-654KB(在1GB RAM上?。R虼耍規缀鮿h除了項目中的幾乎所有圖像,并在首次啟動時從互聯網上下載了它們,并在需要時使用SD卡中的圖片。
要檢查您的應用使用的總內存/可用內存,請執行以下操作:
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();
編輯:我忘記了主要的事情-在您的清單中添加應用程序標記之間的這一行:
android:largeHeap="true"

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

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 ++進行本機開發),請使用多個過程
- 3 回答
- 0 關注
- 640 瀏覽
添加回答
舉報