您的位置:首页 > 其它

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

2017-08-16 19:24 183 查看
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(ur
9aea
l));

        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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: