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 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(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的命名有特殊要求
待完善!………………













更多相关文章

  1. android 获取文件大小
  2. Android极速开发框架One,只需59秒即可!
  3. Android中APP、AMS、WMS的Binder IPC
  4. Android(安卓)网络图片异步加载实例
  5. Android(安卓)- 图片处理之Glide4.0
  6. Android类动态加载技术
  7. 慕课网:Android异步加载AsyncTask项目实战上
  8. Android(安卓)Bitmap压缩策略
  9. Android(安卓)apk动态加载机制的研究(二):资源加载和activity生命周

随机推荐

  1. Android中改变一个图片的透明度
  2. 2011.09.26(2)——— android sample之Note
  3. android HTTP 登陆链接Mysql数据库实现登
  4. Didn't find class "androidx.core.conte
  5. 阅读《Android 从入门到精通》(2)——熟悉
  6. Android使用MQTT协议
  7. Android中实现整个视图切换的左右滑动效
  8. Android --spinner构造下垃菜单
  9. Android stdio调试程序闪退或者报错:"xxx
  10. 简单的修改Android DigitalClock