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

Android之Bitmap高效缓存

一、Bitmap高效加载

1、bitmap的基本概念

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

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

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

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

Bitmap有一些几种加载方式:

	BitmapFactory.decodeResource(); 	资源ID
	BitmapFactory.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的命名有特殊要求
待完善!………………















  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值