网络获取图片的优化

来源:互联网 发布:淘宝店铺地址怎么填写 编辑:程序博客网 时间:2024/05/20 09:24
public class EncoderUtils {    public static String encode(String string) throws Exception {        byte[] hash = MessageDigest.getInstance("MD5").digest(                string.getBytes("UTF-8"));        StringBuilder hex = new StringBuilder(hash.length * 2);        for (byte b : hash) {            if ((b & 0xFF) < 0x10) {                hex.append("0");            }            hex.append(Integer.toHexString(b & 0xFF));        }        return hex.toString();    }}

//第二个类

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.LruCache;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by Administrator on 2017/11/6. */public class ImagesUtils {    Handler handler;    private File cacheDir;    private ExecutorService newFixedThreadPool;    private LruCache<String, Bitmap> lruCache;    /**     * @param context     * @param handler     */    public ImagesUtils(Context context, Handler handler) {        //获得你手机上的最大内存        long maxMemory = Runtime.getRuntime().maxMemory();        int maxSize = (int) (maxMemory / 8);        this.handler = handler;        //得到本app在sd上的缓存文件夹        cacheDir = context.getCacheDir();        // 初始化线程池;初始化5个现成,供程序使用        newFixedThreadPool = Executors.newFixedThreadPool(5);        lruCache = new LruCache<String, Bitmap>(maxSize) {            //每次缓存图片都要调用这个方法;            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getRowBytes() * value.getHeight();            }        };    }    /**     * 取图片,     *     * @param path     * @return     */    public Bitmap getBitMap(String path) {        Bitmap bitmap = lruCache.get(path);        if (bitmap != null) {            System.out.println("我走了内存");            return bitmap;        }        //从本直去取,sd卡去取bitmap        bitmap = getBitMapFromLocal(path);        if (bitmap != null) {            System.out.println("我走了本地缓存");            return bitmap;        }        // 从网络去取        getBitmapFromNet(path);        return null;    }    /**     * 从sd卡获取图片     *     * @param path     * @return     */    private Bitmap getBitMapFromLocal(String path) {        try {            //自己定义的加密工具类            String encode = EncoderUtils.encode(path);            FileInputStream fileInputStream = new FileInputStream(cacheDir                    + "/" + encode);            Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);            //存到内存            lruCache.put(path, bitmap);            return bitmap;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 从网络     *     * @param path     */    private void getBitmapFromNet(final String path) {        //用线程池里的线程执行请求网络操作;        newFixedThreadPool.execute(new Runnable() {            @Override            public void run() {                try {                    URL url = new URL(path);                    HttpURLConnection connection = (HttpURLConnection) url                            .openConnection();                    connection.setConnectTimeout(5000);                    connection.setReadTimeout(5000);                    int responseCode = connection.getResponseCode();                    if (responseCode == 200) {                        InputStream inputStream = connection.getInputStream();                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);                        Message msg = new Message();                        msg.what = 111;                        msg.obj = bitmap;                        Bundle data = new Bundle();                        data.putString("tag", path);                        msg.setData(data);                        handler.sendMessage(msg);                        //缓存到本地                        saveBitmapToLocal(bitmap, path);                        //缓存到内存                        lruCache.put(path, bitmap);                    }                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        });    }    protected void saveBitmapToLocal(Bitmap bitmap, String path) {        try {            String encode = EncoderUtils.encode(path);            FileOutputStream fileOutputStream = new FileOutputStream(cacheDir + "/" + encode);            //图片二次裁剪            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fileOutputStream);        } catch (Exception e) {            e.printStackTrace();        }    }}


//Activity的代码

//全部全局
ImagesUtils imagUtils;String urlBitmap = "http://img.my.csdn.net/uploads/201407/26/1406383264_4787.jpg";private ImageView iv;private Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        if (msg.what == 0) {            Bitmap bitmap = (Bitmap) msg.obj;            // 设置给imageView            String tag = msg.getData().getString("tag");            // 根据标记取出imageView     iv为你要赋值的控件            ImageView imageView = (ImageView) iv.findViewWithTag(tag);            if (imageView != null && bitmap != null) {                // 从网络获取图片                imageView.setImageBitmap(bitmap);                Log.i("tag", "从网络中获取图片");            }        }    }};

//oncreateview里面的代码

iv = (ImageView) findViewById(R.id.iv);//实例化对象ImagesUtils in=new ImagesUtils(this,handler);//调用方法   urlBitmap为URI链接Bitmap bitMap = in.getBitMap(urlBitmap);//给控件赋值iv.setImageBitmap(bitMap);
原创粉丝点击