Android Bitmap Caching Bitmaps(渣翻译)

三、缓存图像

1.使用内存缓存
内存缓存在提高占用APP内存的情况下,提供快速访问图像的便利。
提倡使用LruCache来引用图像(早在API4的Support Library中已经提供该类),通过强引用LinkedHashMap来缓存LruCache,保持最新最近使用的LruCache,移除最后使用的LruCache,从而避免内存溢出。
在过去的缓存引用方式中,比较流行使用SoftReference或者WeakReference来引用图像,然而,在API 9(Android 2.3)开始,资源回收器加强了对它们的回收力度,从而导致它们相当的无效。

为了创建一个大小合适的LruCache,需要考虑一些因素:
A、你的Activity/APP运行后还剩余多大的可用内存(未达到应用的内存限制)
B、一次性加载多少图片到屏幕上;需要(在内存中)准备多少可用的图片来加载到屏幕上,让屏幕上先显示一部分加载好的图片,再继续加载其他未加载的图片,让用户有事可干而不是漫长的等待
C、屏幕的大小和设备的显示密度;加载相同数量的图像到缓存中,高显示密度的设备 xhdpi(如Galaxy Nexus)比低一点的显示密度的设备hdpi(如Galaxy Nexus S)消耗的内存多
D、加载到内存的图像是什么尺寸和配置以及每张图像占多少内存
E、缓存图像的访问频率;哪些图像访问频率要高于其他的,对于访问频率高的图像,可能需要将它们更优先缓存在内存中,或者创建多重LruCache
D、平衡质量与数量;有时候,缓存大量的低质量图像的方式比开启一个线程去加载一个高质量图像要好的多

基本上没有一个特定的大小或准则来使用所有的应用,这只能取决于你对使用状况的分析以及构思出一个合适的解决方案。毕竟,加载一个太小的无用缓存只会造成浪费,而太大可能会导致java.lang.OutOfMemory
异常或APP可用内存偏低(未达到应用的内存限制)

首先需要获取VM可用的最大内存值(Mb),超过这个值会触发OutOfMemory异常,需要注意的是,存储在LruCache中的图像是以Kb计算的,在计算存储大小的时候记得单位转换

final int maxMemory = (int)(Runtime.getRuntime().maxMemery() / 1024);
//假设去1/8的maxMemory来缓存图像
final int cacheSize = maxMemory / 8;
LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
        // The cache size will be measured in kilobytes rather than
        // number of items.
        return bitmap.getByteCount() / 1024;
    }
};
//缓存图像
if (mMemoryCache.get(key) == null) {
    mMemoryCache.put(key, bitmap);
}

2.使用本地缓存
内存缓存在快速访问最近显示过的图像是很有用,然而你不能过分依赖这些加载过在内存里的图像。像GridView这类组件,当加载大量数据的时候很容易就填满内存缓存。
你的应用会因一个其他的任务(如来电电话)的拦截而被置于后台,你的应用可能会被kill并且缓存被回收掉(系统杀人劫货啦)。当你的应用再从onResume()方法中恢复时,
应用不得不再次去加载每一个图像。

时间: 2024-09-28 02:45:47

Android Bitmap Caching Bitmaps(渣翻译)的相关文章

Android Training Caching Bitmaps 翻译

原文:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html 图片缓存 在Android开发中,加载一个图片到界面很容易,但如果一次加载大量图片就复杂多了.在很多情况下(比如:ListView,GridView或ViewPager),能够滚动的组件需要加载的图片几乎是无限多的. 有些组件的child view在不显示时会回收,并循环使用,如果没有任何对bitmap的持久引用的话,垃圾回收器会释放你加载的

Android Bitmap Processing Bitmaps Off the UI Thread(渣翻译)

二:UI线程外加载图像 1.使用AsyncTaskAsyncTask类提供了一个简单的后台处理方法并将结果返回到UI线程中.在线程中提议使用WeakReference<?>来缓存显示Bitmap的UI控件,如:ImageView.WeakReference能够确保即使在线程操作时,也能让资源回收器回收UI控件资源,如:ListView回收View资源的情况.ex: ImageView imageview = new ImageView(new LayoutParams(100, 100));

android Caching Bitmaps学习

参考链接: Displaying Bitmaps Efficiently Caching Bitmaps 翻译 先吐槽一下:google 给示例中都有错误的地方,国内翻译的也不去掉错误.太坑. 谷歌官方Download the sample 也可参照guolin的文章, 经过一番学习,初步实践完成.贴出来,备用. package com.akm.testlrucache; import android.app.Activity; import android.content.Context; i

Caching Bitmaps

由于要做网络图片的显示,所以先翻译了一下官网的文档,以作备用,  地址http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html. Loading a single bitmap into your user interface (UI) is straightforward, however things get more complicated if you need to load a large

Android Bitmap 开源图片框架分析(精华三)

主要介绍这三个框架,都挺有名的,其他的框架估计也差不多了 Android-Universal-Image-Loaderhttps://github.com/nostra13/Android-Universal-Image-Loader ImageLoaderhttps://github.com/novoda/ImageLoader Volley(综合框架,包含图片部分)https://github.com/mcxiaoke/android-volley 扯淡时间,可以跳过这段这些开源框架的源码还

Android Bitmap 加载多张图片的缓存处理(精华二)

一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~不用重新下载图片但是手机内存是很有限的~当缓存的图片越来越多,即使单张图片不是很大,不过数量太多时仍然会出现OOM的情况了~本篇则是讨论多张图片的处理问题 -----------------------------------------------------------------------

Android Bitmap 全面解析(二)加载多张图片的缓存处理

一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~不用重新下载图片但是手机内存是很有限的~当缓存的图片越来越多,即使单张图片不是很大,不过数量太多时仍然会出现OOM的情况了~本篇则是讨论多张图片的处理问题-----------------------------------------------------------------------图片

Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移

Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移      很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitmap显示出来. matrix里有一个3x3的矩阵,用于图像处理: MSCALE_X MSKEW_X MTRANS_X MSKEW_Y MSCALE_Y MTRANS_Y MPERSP_0 MPERSP_1 MPERSP_2 根据变量名能猜出具体的用途:缩放X 偏移X 平移X偏移Y 缩放Y 平移Y透视0

Android Bitmap 用法总结

android Bitmap用法总结 Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 1.Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsi