我的做法是時間換空間,儘量檔案化一些佔用記憶體的資料。最典型的就是ListView中的Bitmap,可以參考這個開源元件的實現。 其將Bitmap都本地檔案快取,記憶體中只保留最近使用的4張圖片,在使用中發現還是會偶爾出現OOM,然後我就將其改為完全的讀取檔案,記憶體中不保留圖片,使用以後都自動回收,由此擴充套件的資料檔案也同樣快取成檔案。
除了Bitmap,其他的地方沒想到什麼能佔用這麼大記憶體,網路下載下來的資料檔案?需要都留在記憶體中嗎?目前我做的應用,每次請求的資料大小都比較小,每次Http請求下來的資料都把url轉換成檔名,然後快取成檔案,在下次Http請求的時候先根據url來預讀檔案,暫時不用的資料就釋放掉。
經常會OOM我覺得就是在Bitmap處理的時候,比如decodeFile,在往介面上載入圖片時,不用直接載入原圖,可以進行縮放。一張1000*1000的圖片要載入到一個100*100的ImageView上,直接載入進來大多數都會OOM,可以先用inJustDecodeBounds
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
拿到這個圖片的大小,再算好縮放比例
int scale = 0;
scale = (int)(options.outHeight / (float)size);
if (scale
scale = 1;
}
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
再進行decode。
總之就是儘量時間換空間,實際這個時間是非常非常短的,使用者體驗內的。
我的做法是時間換空間,儘量檔案化一些佔用記憶體的資料。最典型的就是ListView中的Bitmap,可以參考這個開源元件的實現。 其將Bitmap都本地檔案快取,記憶體中只保留最近使用的4張圖片,在使用中發現還是會偶爾出現OOM,然後我就將其改為完全的讀取檔案,記憶體中不保留圖片,使用以後都自動回收,由此擴充套件的資料檔案也同樣快取成檔案。
除了Bitmap,其他的地方沒想到什麼能佔用這麼大記憶體,網路下載下來的資料檔案?需要都留在記憶體中嗎?目前我做的應用,每次請求的資料大小都比較小,每次Http請求下來的資料都把url轉換成檔名,然後快取成檔案,在下次Http請求的時候先根據url來預讀檔案,暫時不用的資料就釋放掉。
經常會OOM我覺得就是在Bitmap處理的時候,比如decodeFile,在往介面上載入圖片時,不用直接載入原圖,可以進行縮放。一張1000*1000的圖片要載入到一個100*100的ImageView上,直接載入進來大多數都會OOM,可以先用inJustDecodeBounds
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
拿到這個圖片的大小,再算好縮放比例
int scale = 0;
scale = (int)(options.outHeight / (float)size);
if (scale
scale = 1;
}
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
再進行decode。
總之就是儘量時間換空間,實際這個時間是非常非常短的,使用者體驗內的。