0
我的活動有一個ImageView,佔用大約一半的肖像畫面和少一點的景觀。我使用inSampleSize加載位圖以節省內存,但我沒有做任何明確清理內存的操作。我以前瘋狂回收我的Bitmaps之前薑餅,但我已經更加放鬆,因爲位圖數據顯然被轉移到Dalvik虛擬機。沒有任何清理代碼,事情在正常使用情況下工作,但我注意到,如果我多次旋轉此活動,內存不足。因此,我添加了薑餅之前看到的那種積極的內存清理代碼,它不再崩潰。不過,我想知道這是否過分。是否所有這些代碼都等同於在OnDestroy中將我的Bitmap和ImageView設置爲null,或者是追蹤底層Bitamp對象並回收它們仍然有效且必要的額外工作?這裏是我的代碼,修好了我OOME崩潰:仍然必須回收Android 4+中的位圖嗎?
Bitmap thumbnail;
@InjectView(R.id.thumbnail) ImageView image;
@Override
protected void onDestroy() {
cleanupImageMemory();
super.onDestroy();
}
private void cleanupImageMemory() {
if (thumbnail != null) {
thumbnail.recycle();
thumbnail = null;
}
if (image != null) {
Drawable d = image.getDrawable();
if (d != null && d instanceof BitmapDrawable) {
BitmapDrawable db = (BitmapDrawable) d;
if (db.getBitmap() != null) {
db.getBitmap().recycle();
}
}
d = null;
image = null;
}
System.gc();
}
當你發現你得到「內存不足」時,屏幕方向是改變了這麼多次,對不對?但是當方向發生變化時,活動被重新創建,因此主動清理內存,通過在AndroidManifest.xml中將屬性「android:configchanges」設置爲活動來停止活動的重新創建。 –
位圖有多大?它是沒有意義的,如果它是一個小的,它會導致OOM。 –