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