1. 程式人生 > >Android的列表展示大量圖片防止記憶體溢位的處理辦法

Android的列表展示大量圖片防止記憶體溢位的處理辦法

根據專案需求獲取手機相簿中的所有圖片並通過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();
    }