Android之Bitmap高效缓存以及android缓存策略
2017-12-24 15:01
471 查看
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的命名有特殊要求
待完善!………………
相关文章推荐
- Bitmap高效加载及Android缓存策略
- Android进阶练习 - 高效显示Bitmap(缓存 Bitmaps)
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- Android Bitmap 缓存策略
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- Bitmap的高效加载以及缓存机制
- Android高效加载图片和缓存策略LRU,DiskLRU
- Android Bitmap高效加载与LruCache内存缓存
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- 【Android Training - 09】高效地显示Bitmap图片 [ Lesson 3 - 两种缓存Bitmap的方式 ]
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- BitMap高效显示策略(三):使用内存缓存技术和BitmapFactory.Options.inBitmap参数
- 【Android】【缓存】Andrid高效显示Bitmap( 使用缓存技术)
- Android进阶练习 - 高效显示Bitmap(缓存 Bitmaps)
- Android Training - 高效地显示Bitmap(两种缓存Bitmap的方式)与优化Bitmap的内存使用
- Android中高效的显示图片之三——缓存图片
- android: 缓存异步加载Bitmap
- Android之Bitmap 高效加载