Android之Bitmap高效缓存以及android缓存策略

来源:互联网 发布:html5手机框架 apache 编辑:程序博客网 时间:2024/05/16 15:09

Android之Bitmap高效缓存

一、Bitmap高效加载

1、bitmap的基本概念

位图:获取像素值进行加载。

Bitmap是Android系统中图像处理中的最重要的一个类。

通过Bitmap我们也看获取图片的信息

获取到信息后,我们可以对其进行缩放、裁剪等操作
2、Bitmap的加载方式

Bitmap有一些几种加载方式:

BitmapFactory.decodeResource(); 资源IDBitmapFactory.decodeStream();流(网络)BitmapFactory.decodeByteArray();字节数组BitmapFactory.decodeFile();文件路径

3、如何高效加载Bitmap

防止内存溢出
尽可能的节省内存的开销
使我们的应用运行更加流畅

BitmapFactory.Options为我们高效加载提供看可能。
injustDecodeBounds 值获取宽和高
outWidth&outHeight
insmallSize 采样率
工具类
package com.example.jash.bitmap;import android.graphics.Bitmap;import android.graphics.BitmapFactory;/** * Created by jash on 2017/12/24. */public class BitmapUtils {    /**     * 压缩方法     *     * @param filepath 文件路径     * @param pixelw   真正显示的宽度     * @param piexlh   真正显示高度     * @return     */    public static Bitmap ratio(String filepath, int pixelw, int piexlh) {        BitmapFactory.Options options = new BitmapFactory.Options();//        只加载图片的宽和高,不加载图片深圳的内容        options.inJustDecodeBounds = true;//        位深度,566 低  内存占用小        options.inPreferredConfig = Bitmap.Config.RGB_565;//      预加载  之后可以获取宽和高        BitmapFactory.decodeFile(filepath, options);//        获取原始的宽和高        int originalw = options.outWidth;        int originalh = options.outHeight;//        采样        options.inSampleSize = getSimpleSize(originalw, originalh, pixelw, piexlh);//        真正加载        options.inJustDecodeBounds = false;        return BitmapFactory.decodeFile(filepath, options);    }    private static int getSimpleSize(int originalw, int originalh, int pixelw, int piexlh) {        int simpleSize = 1;        if (originalw > originalh && originalw > pixelw) {            simpleSize = originalw / pixelw;        } else if (originalh > originalw && originalh > piexlh) {            simpleSize = originalh / piexlh;        }        if (simpleSize <= 0) {            simpleSize = 1;        }        return simpleSize;    }}
缓存的概念:
缓存就是将从服务器获取到的json或者file等保存到本地,
缓存的优势:对一下不经常发生变化的数据,直接使用本地缓存,提升响应速度
    不在频繁的请求服务器,减少服务器的负载
     离线阅读等
使用场景:对Bitmap或者是file大数据进行缓存,无需每次都重新下载,尤其是ListView
  数据不需要适时的更新,离线
缓存策略:LruCache内存缓存
DIskLruCache硬盘缓存
Sql实现缓存(持久  不建议)
LruCache缓存
1、Lru是计算机科学经常使用的一种《近期最少使用的算法》
2、内部采用的是LinkedHashMap
注意问题:
1、内存缓存使用的是我们宝贵的内存资源,需要系统动态的调整内存的大小
2、注意版本适配,建议使用sopportv4包中的LruCache
方法:
package com.example.jash.bitmap;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.LruCache;import android.widget.ImageView;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;/** * Created by jash on 2017/12/24. * 用于加载网络图片,并缓存到本地或者内存中 */public class SimpleImageLoader {    private static SimpleImageLoader mloader;    private LruCache<String, Bitmap> mLrucache;    public static SimpleImageLoader getInstance() {        if (mloader == null) {            synchronized (SimpleImageLoader.class) {                if (mloader == null) {                    mloader = new SimpleImageLoader();                }            }        }        return mloader;    }    //    用来初始化缓存对象    private SimpleImageLoader() {        int maxSize = (int) Runtime.getRuntime().maxMemory() / 8;        mLrucache = new LruCache<String, Bitmap>(maxSize) {            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getByteCount();            }        };    }    /**     * 用于加载网络图片     * @param view     * @param url     */    public void displayImage(ImageView view, String url) {        Bitmap bitmap = getBitmapFromcache(url);        if (bitmap != null) {            view.setImageBitmap(bitmap);        } else {            downLoadImage(view, url);        }    }    /**     * 从缓存中读取图片     *     * @param url     * @return     */    private Bitmap getBitmapFromcache(String url) {        return mLrucache.get(url);    }    /**     * 将下载下来的图片保存到缓存中     *     * @param bitmap     * @param url     */    private void putBitmapToCache(Bitmap bitmap, String url) {        if (bitmap != null) {            mLrucache.put(url, bitmap);        }    }    private void downLoadImage(final ImageView imageView, final String url) {        OkHttpClient client = new OkHttpClient();        final Request request = new Request.Builder().get()                .url(url)                .build();        client.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                byte[] bytes = response.body().bytes();                Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);                putBitmapToCache(bitmap, url);            }        });    }}
main类中
package com.example.jash.bitmap;import android.graphics.BitmapFactory;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import com.squareup.picasso.Picasso;public class MainActivity extends AppCompatActivity {    private ImageView image;    private final String IMAGE_URL = "http://img1.qq.com/ent/20050913/2312751.jpg";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        image = (ImageView) findViewById(R.id.down_image);    }    public void dowm(View view) {        SimpleImageLoader loader = SimpleImageLoader.getInstance();        loader.displayImage(image, IMAGE_URL);    }}
DiskLruCache硬盘缓存:
第三方开源库:
1、通过DiskLruCache.open去初始化一个缓存对象
2、通过DiskLruCache.get(String key)去获取到本地key下的缓存文件
3、通过DiskLruCache.Editor对象将数据保存到本地
注意问题:
1、根据外部存储设置合适的缓存路径;
有外置/sdcard/Android/data/包名/cache
无外置/data/data/Android/data/包名/cache
2、缓存文件对key的命名有特殊要求
待完善!………………













阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 丹姿水密码多少钱 丹姿化妆品价格 丹姿睡眠面膜怎么样 丹姿水密码补水霜 丹姿化妆品批发 丹姿水密码适合年龄 丹姿一套多少钱 丹姿水密码面膜价格 正品丹姿水密码价格表 丰韵丹姿丰胸精油 丹姿水密码一套多少钱 丹姿洗面奶好用吗 丹姿水密码多少钱一套 丹姿面膜多少钱 丹姿的护肤品怎么样 丹姿他能量男士洗面奶 丹姿水密码的护肤品怎么样 丹姿润白柔肤水 丹姿海藻美白洗颜泥多少钱 丹姿水密码睡眠面膜 丹姿他能量沐浴露 丹姿水密码价格 丹姿他能量男士 水密码 水密码好用吗 水密码旗舰店 丹资 丹娜 丹媚 丹媚 说明书 丹宁 丹宁是什么 丹宁执着 丹宁是什么意思 丹宁酸 赤耳丹宁 丹宁裤 丹宁色 丹宁夹克 丹宁布 丹宁片