`

图片缓存处理

阅读更多
在占用宝贵的应用程序内存情况下,内存缓冲提供了可以快速访问位图.LruCache类(也可以使用API级别4的Support Library)特别适合用于缓存位图的任务,最近被引用的对象保存在一个强引用LinkedHashMap中,以及在缓存超过了其指定的大小之前释放最近很少使用的对象的内存.
注意:在过去,一个常用的内存缓存实现是一个SoftReference或WeakReference的位图缓存,然而现在不推荐使用.从android2.3(API 级别9)开始,垃圾回收器更加注重于回收软/弱引用,这使得使用以上引用很大程度上无效.此外,之前的android3.0(API级别11),位图的备份数据存储在本地那些在一种可预测的情况下没有被释放的内存中,很有可能会导致应用程序内存溢出和崩溃.
为了选择一个合适的的LruCache大小,许多因素应当被予以考虑,例如:
其余的活动或者应用程序都是很耗内存的嘛?
大量的图片是如何立刻出现在屏幕上的?需要多少即将在屏幕上显示的?
设备的屏幕的大小和分辨率是多少?一个额外的高密度屏(xhdpi)设备,例如Galaxy Nexus 将需要一个更大的缓存来维持内存中相同数量的图片,与像Nexus S (hdpi)设备比较起来.
位图是什么尺寸和配置以及每张图片要占用多少内存?
图片访问频繁嘛?比起别的将会被频繁地访问吗?也许你可能总是想要在内存中保存一定项,甚至对于不同的位图组来说有多个LRUCache对象.
你能在数量和质量之间取得平衡嘛?有时对于存储更多的低质量的位图是更有用的,潜在地在另外的后台任务中加载一个更高质量版本.
没有具体的大小以及适合所有应用程序的公式,它是由你来分析您的使用情况,并拿出一个合适的解决方案.缓存太小会导致额外的没有益处的开销,缓存过大会再次导致java.lang.OutOfMemory异常,并且只保留下你的应用程序其余相当少的内存来运行你的应用程序. 这个例子是针对位图来设置一个LruCache:
private LruCache mMemoryCache;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
    ...
    // Get memory class of this device, exceeding this amount will throw an
    // OutOfMemory exception.
    final int memClass = ((ActivityManager) context.getSystemService(
            Context.ACTIVITY_SERVICE)).getMemoryClass();
    // Use 1/8th of the available memory for this memory cache.
    final int cacheSize = 1024 *  1024 *  memClass / 8;
    mMemoryCache = new LruCache(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // The cache size will be measured in bytes rather than number of items.
            return bitmap.getByteCount();
        }
    };
    ...
 }
 public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
 }
 public Bitmap getBitmapFromMemCache(String key) {
     return mMemoryCache.get(key);
 }

注意:在这个例子中,应用程序中八分之一的内存被用作缓存.在一个普通的/hdpi设备中最低有4MB.在一个800* 480分辨率的设备上全屏显示一个充满图片的GridView控件视图将使用1.5MB左右的缓存,所以这将在内存中缓冲至少四分之一的图片.
当将一张位图加载进一个ImageView中,LruCache首先被检查.如果有输入,缓存立刻被使用来更新这个ImageView视图,另外一个后台线程随之诞生来处理这张图片:
public void loadBitmap(int resId, ImageView imageView) {
    final String imageKey = String.valueOf(resId);
    final Bitmap bitmap = getBitmapFromMemCache(imageKey);
    if (bitmap != null) {
        mImageView.setImageBitmap(bitmap);
    } else {
        mImageView.setImageResource(R.drawable.image_placeholder);
        BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
        task.execute(resId);
    }
 }

BitmapWorkerTask也需要被更新添加到内存缓冲项中:
class BitmapWorkerTask extends AsyncTask {
    ...
    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        final Bitmap bitmap = decodeSampledBitmapFromResource(
                getResources(), params[0], 100, 100));
        addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
        return bitmap;
    }
    ...
 }
分享到:
评论

相关推荐

    android 图片缓存处理

    ### Android 图片缓存处理详解 #### 概述 在Android开发中,图片缓存是一项重要的技术,尤其是在处理网络图片加载、浏览应用等场景时。合理的图片缓存机制不仅可以提高应用性能,减少流量消耗,还能提升用户体验。...

    android 图片缓存处理,及异步加载类

    "Android 图片缓存处理,及异步加载类"这个主题主要涵盖了两个关键知识点:图片缓存和异步加载。 首先,让我们深入了解一下图片缓存。在Android应用中,频繁地加载网络图片会导致用户体验下降,因为这会消耗大量的...

    Android状态保存、用户偏好设置保存、通过universal_image_loder网络加载图片并做图片缓存处理Demo

    Android状态保存、用户偏好设置保存、通过universal_image_loder网络加载图片并做图片缓存处理Demo 1、将universal-image-loder...jar包放入项目的libs文件里,并引入。 2、将MyApplication.java类放入项目,具体...

    Android加载网络图片缓存处理库的使用-Universal-ImageLoader

    Universal Image Loader (UIL) 是一个强大的Android图片加载库,它提供了缓存机制、线程控制、图片占位符等功能,使得在Android应用中加载网络图片变得更加简单和高效。本文将详细介绍如何使用Universal ImageLoader...

    提供图片缓存框架的通俗设计思路

    让你快速构建类似于SDWebImage的图片缓存框架,读者可以直接使用CLWebImage,也可以根据该种思路构建自己的图片缓存处理逻辑,面试或者项目中经常会遇到!实例地址:https://github.com/chengliuAres/CLWebImageDemo

    图片缓存框架使用

    本主题将详细探讨如何利用开源的图片缓存框架来优化这一过程,以提高用户体验和应用性能。我们将重点关注以下几个方面: 1. **图片缓存的重要性**:在Android设备上,频繁地从网络加载图片会消耗大量的数据流量,...

    Android Google官网的图片缓存源码

    在Android开发中,图片缓存是一项至关重要的技术,它能够有效地提高应用的性能,减少网络请求,节省用户流量,同时优化用户体验。Google官网的图片缓存源码是开发者们学习和借鉴的最佳实践之一。本文将深入探讨...

    完美的网络图片缓存

    在Android应用开发中,高效的网络图片缓存是提高用户体验的关键因素之一。"完美的网络图片缓存"是指一种优化策略,旨在高效地加载、存储和管理从互联网获取的图像,同时减少对服务器的请求次数和避免内存泄漏。下面...

    android图片缓存有关的项目

    在Android开发中,图片缓存是一项非常重要的技术,特别是在处理大量图片展示的应用中,如社交媒体、电商应用等。本项目“android图片缓存有关的项目”旨在帮助开发者深入理解图片缓存的原理,并提供实践操作的机会。...

    Android图片缓存管理(管理SDK卡例子)

    总的来说,Android图片缓存管理涉及内存缓存、磁盘缓存、缓存策略、内存泄漏预防以及图片尺寸处理等多个方面。通过合理地运用这些技术,可以显著提升应用的性能和用户体验。在实践中,我们可以选择适合的图片加载库...

    图片缓存到SD或手机,简单易懂

    在Android开发中,图片缓存是一项非常重要的技术,特别是在处理大量图片展示的场景下,如社交媒体、电商应用等。图片缓存能够有效地提高用户体验,减少网络请求,避免内存溢出,节省用户流量。本教程“图片缓存到SD...

    图片缓存工具类

    在IT行业中,图片缓存工具类是开发移动应用或网页时不可或缺的一部分,它主要用于优化用户体验,提高应用程序性能,特别是对于那些需要频繁加载和显示图片的应用。这个“图片缓存工具类”很可能是一个自定义的Java或...

    ios 图片缓存类

    在iOS开发中,图片缓存是一个非常重要的环节,特别是在处理大量图片展示的场景下,如瀑布流、相册浏览等。本项目提供的“ios 图片缓存类”旨在提供一个简单易用的解决方案,利用GCD(Grand Central Dispatch)进行...

    Android中非常好图片缓存ImageCache

    ImageCache就是为了解决这个问题而设计的一种高效图片缓存机制。这个库是由一位知名的开发者编写的,它提供了一个相对完整且系统的解决方案,尽管存在一些小缺点,但整体来说在很多场景下都能表现出色。 首先,让...

    Android之本地缓存——LruCache(内存缓存)与DiskLruCache(硬盘缓存)统一框架

    该框架或者说库,主要是用于本地的图片缓存处理。 数据的存入 当你取到图片的元数据,会将数据存入硬盘缓存以及内存缓存中。 数据的获取 取数据的时候,先从内存缓存中取; 如果没有取到,则从硬盘缓存中取(此时...

    Android实现WebView图片缓存,替换加载前默认图片的样式

    通过以上步骤,我们就成功地实现了在Android的WebView中进行图片缓存、替换加载前的默认图片样式以及图片点击事件的处理。这不仅提升了用户体验,还能有效地减少网络资源的消耗。同时,这些技术也可以作为基础,...

    图片缓存自定义

    在图片缓存中,我们可以利用RxJava的Observable和Subscriber来处理图片的获取和显示。Observable负责监听网络请求或本地缓存,Subscriber则负责订阅这些事件并在适当的时候执行相应的操作,如将新图片加载到视图或者...

    volley获取图片并缓存

    Volley的图片缓存机制主要包括两个部分:内存缓存和磁盘缓存。内存缓存是基于LRU(Least Recently Used)算法的,它会优先移除最近最少使用的数据,以保证内存的高效利用。磁盘缓存则将图片存储在设备的外部存储空间...

    Android-AndroidImageLoader加载图片处理图片图片缓存

    `Android-AndroidImageLoader加载图片处理图片图片缓存`这个项目主要关注如何使用Glide框架及其扩展库glide-transformations来高效地加载、处理和缓存图片。下面将详细解释这些知识点。 **Glide框架** Glide是...

Global site tag (gtag.js) - Google Analytics