三次缓存,imgloder配置,二次采样

来源:互联网 发布:股票入门知识软件 编辑:程序博客网 时间:2024/06/03 13:53
package com.kson.viewpagerautobanner.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v4.app.INotificationSideChannel;
import android.widget.ImageView;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;

/**
 * Author:kson
 * E-mail:19655910@qq.com
 * Time:2017/08/16
 * Description:封装bitmap三级缓存工具类
 */
public class NetworkUtils {

    //文件夹目录
    private final String SDCARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/kson/";

    private String url;
    private ImageView iv;

    //弱引用集合,弱引用(jvm垃圾回收的时候,只有内存不足时才回收)
    private HashMap<String,SoftReference<Bitmap>> hashMap = new HashMap<>();


    public NetworkUtils(String url, ImageView iv) {
        this.url = url;
        this.iv = iv;
    }

    /**
     * 网络请求
     */
    public void execute(){
        new BitmapTask().execute(url);
    }


    /**
     * 网络请求异步任务类
     */
    class BitmapTask extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(String... strings) {

            try {
                URL url = new URL(strings[0]);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                connection.connect();
                if (200 == connection.getResponseCode()) {

                    InputStream inputStream = connection.getInputStream();
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inJustDecodeBounds = true;
                    BitmapFactory.decodeStream(inputStream);
                    options.inSampleSize = 4;
                    options.inJustDecodeBounds = false;

                    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                    return bitmap;

                }


            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            iv.setImageBitmap(bitmap);
            memory(url,bitmap);
            diskMemory(url,bitmap);
        }
    }

    /**
     * 把bitmap存到sdcard中,本地存储
     *
     * @param url
     * @param bitmap
     */
    public void diskMemory(String url, Bitmap bitmap) {
        try {
            File dir = new File(SDCARD_PATH);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            File file = new File(SDCARD_PATH + new Md5FileNameGenerator().generate(url));
            OutputStream outputStream = new FileOutputStream(file);
            //把bitmap'写入到sdcard
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取磁盘的bitmap
     * @param url
     * @return
     */
    public Bitmap getDiskMemory(String url) {

        File file = new File(SDCARD_PATH + new Md5FileNameGenerator().generate(url));
        if (file != null && file.exists()) {
            try {
                InputStream inputStream = new FileInputStream(file);

                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                return bitmap;

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        return null;

    }

    /**
     * 内存缓存
     * @param url
     * @param bitmap
     */
    public  void memory(String url,Bitmap bitmap){
        //得到软引用对象
        SoftReference<Bitmap> bmp = new SoftReference<Bitmap>(bitmap);
        //存储软引用对象
        hashMap.put(new Md5FileNameGenerator().generate(url),bmp);
    }

    /**
     * 从内存缓存取出bitmap
     * @param url
     * @return
     */
    public Bitmap getMemory(String url){
        Bitmap bitmap = null;
        //得到软引用对象
        SoftReference<Bitmap> bmpReference = hashMap.get(new Md5FileNameGenerator().generate(url));
        if (bmpReference!=null){
            bitmap = bmpReference.get();
        }

        return bitmap;

    }


}

二次采样

实现步骤

第一步:BitmapFactory.Option

设置 inJustDecodeBounds为true

第二步:BitmapFactory.decodeFile(path,option)方法(或者decodeStream())

解码图片路径为一个位图。如果指定的文件名是空的,或者不能解码到一个位图,函数将返回null[空值]。

获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度)

第三步:计算缩放比例,也可以不计算,直接给它设定一个值

options.inSampleSize = “你的缩放倍数”;//必须为2的幂

如果是2就是高度和宽度都是原始的一半。

第四步:设置options.inJustDecodeBounds =false;

imgloder


原创粉丝点击