Android的列表展示大量圖片防止記憶體溢位的處理辦法
阿新 • • 發佈:2019-02-11
根據專案需求獲取手機相簿中的所有圖片並通過recyclerview列表展示
原因是拿到手機相簿圖片後存入一個集合,並把該集合的圖片路徑資料在迴圈中逐個取出來賦給實體類,同時也多此一舉的把圖片轉bitmap並壓縮,另外在列表載入圖片選擇的是gilde方式。但是加載出現了嚴重的問題,經過測試,在一些機型上會直接丟擲OOM,開始不明所以,後面發現是我的實體類出現了問題即:實體類中的圖片是一個bitmap型別而不是String型別的路徑,所有儘管在迴圈中對集合的圖片路徑轉bitmap做了壓縮,但是面對大量的圖片資料時會出現OOM,最好的解決辦法就是實體類中的圖片型別用String來表示路徑,gilde載入路徑就可以了
Glide.with(mActivity)
.load(“圖片地址”)
.into(“顯示控制元件”);
另外,為了提高執行效率,建議獲取相簿圖片寫在子執行緒中並更新列表介面可即:( mPhotoAdapter是列表的介面卡,實體類SystemPhotoBean)
private ArrayList<SystemPhotoBean> mSystemPhotoList = new ArrayList<>(); private List<String> mPhotoList; private void getAllPhotoInfo() { new Thread(new Runnable() { @Override public void run() { mPhotoList = new ArrayList<String>(); Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(uri, null, null, null, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { int index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); String path = cursor.getString(index); // 檔案地址 File file = new File(path); if (file.exists()) { mPhotoList.add(path); Log.i(TAG, path); } } cursor.close(); } for (int i = mPhotoList.size() - 1; i >= 0; i--) { SystemPhotoBean systemPhotoBean = new SystemPhotoBean(); systemPhotoBean.setId(i + ""); systemPhotoBean.setDesc(mPhotoList.get(i)); mSystemPhotoList.add(systemPhotoBean); } //更新介面 runOnUiThread(new Runnable() { @Override public void run() { mPhotoAdapter.notifyDataSetChanged(); } });//更新介面 runOnUiThread(new Runnable() { @Override public void run() { mPhotoAdapter.notifyDataSetChanged(); } }); } }).start(); }