Android的listview中图片加载的优化

费了好大劲写玩才发现早就有现成的三方(glide)了,还是记下来吧。

为什么优化?因为图片大了很容易超出内存导致崩溃。

原理很简单,压缩图片,保存。

工具类。

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by Administrator on 2017/4/1.
 */

public class SaveThumbUtils {
    //这个thumbpath是工作目录,
    public static void saveThumb(String imagePath,String workPath){
        int width=100;//缩略图的宽
        int height=100;//缩略图的高
        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        // 获取这个图片的宽和高,注意此处的bitmap为null
        bitmap = BitmapFactory.decodeFile(imagePath, options);
        options.inJustDecodeBounds = false; // 设为 false
        // 计算缩放比
        int h = options.outHeight;
        int w = options.outWidth;
        int beWidth = w / width;
        int beHeight = h / height;
        int be = 1;
        if (beWidth < beHeight) {
            be = beWidth;
        } else {
            be = beHeight;
        }
        if (be <= 0) {
            be = 1;
        }
        options.inSampleSize = be;
        // 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
        bitmap = BitmapFactory.decodeFile(imagePath, options);
        // 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
                ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
        File f = new File(workPath+"/thumb/"+imagePath.replace("/","").replace(".",""));
        if (f.exists()) {
            f.delete();
        }
        try {
            FileOutputStream out = new FileOutputStream(f);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
然后oncreate加载时。
 try {
                        final ImageView oldImage = imgDrawShow;
                        final String tfilepath = filepath;
                        File tFile = new File(sd + "/thumb/" + filepath.replace("/", "").replace(".", ""));
                        if (!tFile.exists()) {
                            new Thread() {
                                public void run() {
                                    SaveThumbUtils.saveThumb(tfilepath, sd);
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            final Bitmap bm = BitmapFactory.decodeFile(sd + "/thumb/" + tfilepath.replace("/", "").replace(".", ""));
                                            oldImage.setImageBitmap(bm);
                                        }
                                    });
                                }
                            }.start();
                        }
                        else {
                            Bitmap bm = BitmapFactory.decodeFile(sd + "/thumb/" + filepath.replace("/", "").replace(".", ""));
                            imgDrawShow.setImageBitmap(bm);
                        }
                    }catch (Exception e){}

新增时。

new Thread() {
                public void run() {
                    SaveThumbUtils.saveThumb(filePath,sd);
                    runOnUiThread(new Runnable(){
                        @Override
                        public void run() {
                            try {
                                Bitmap bm = BitmapFactory.decodeFile(sd+"/thumb/"+filePath.replace("/","").replace(".",""));
                                imgDrawShow.setImageBitmap(bm);
                            }catch (Exception e){
                            }
                        }
                    });
                }
            }.start();


你可能感兴趣的:(Android的listview中图片加载的优化)