[读书笔记]《APP研发录》之App图片缓存设计
图片缓存在Android开发中十分重要,从网络获取图片、显示、回收任一环节有问题都会导致OOM。尤其是列表项,会加载大量网络上的图片。当我们快速滑动列表的时候会很卡,甚至会导致内存溢出而崩溃。
为解决上述问题,ImageLoader出现了,ImageLoader的目的是为了实现异步的网络图片加载,缓存及显示,支持多线程异步加载。
ImageLoader的原理
在显示图片的时候,它会先在内存中查找,如果没有,就去本地查找,如果还没有,就去开启一个新的线程去下载这张图片,下载成功后会把图片同时缓存到内存和本地。
基于它的原理,我们在每次退出一个页面的时候,把ImageLoader内存中的缓存全部清除,这样节省了大量内存,下次再用的时候从本地取出来就是了。ImageLoader采用的是软引用的形式,所以内存中的图片会在内存不足时被系统回收。
ImageLoader的使用
- ImageLoaderConfiguration: 对图片缓存进行总体配置,包括内存缓存的大小,本地缓存的大小和位置、日志、下载策略(FIFO还是LIFO)等等
- ImageLoader: 我们一般使用displayImage来把URL对应的图片显示在ImageView上。
- DisplayImageOptions: 在每个页面需要显示图片的地方,控制如何显示的细节,比如指定下载时的默认图(包括下载中,下载失败,URL为空等),是否将缓存放到内存或本地磁盘。
1、我们新建一个Application类,在里面总体配置ImageLoader:
public class ImageCacheApplication extends Application {@Overridepublic void onCreate() {super.onCreate();CacheManager.getInstance().initCacheDir();ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()).threadPriority(Thread.NORM_PRIORITY - 2).memoryCacheExtraOptions(480, 480).memoryCacheSize(2 * 1024 * 1024).denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).memoryCache(new WeakMemoryCache()).build();ImageLoader.getInstance().init(config);}
}
2、在使用ImageView加载图片的地方,配置当前页面的ImageLoader选项,有可能是Activity,也有可能是Adapter.
private final ArrayList<CinemaBean> cinemaList;
private final AppBaseActivity context;
private DisplayImageOptions options;
public CinemaAdapter(ArrayList<CinemaBean> cinemaList,AppBaseActivity context) {this.cinemaList = cinemaList;this.context = context;options = new DisplayImageOptions.Builder().showStubImage(R.drawable.ic_launcher).showImageForEmptyUri(R.drawable.ic_launcher).cacheInMemory().cacheOnDisc().build();}
3、在使用ImageView加载图片的地方,使用ImageLoader:
context.imageLoader.displayImage(cinemaList.get(position).getCinemaPhotoUrl(), holder.imgPhoto);
其中displayImage方法的第一个参数是图片的URL,第二个参数是ImageView控件。
一般来说,ImageLoader如果性能有问题,就和这里的配置有关,尤其是ImageLoaderConfiguration。
ImageLoader的优化
尽管ImageLoader很强大很好用,但是它会一直把图片缓存到内存中,会导致内存过高,即便图片的引用是软引用,软引用在内存不足的时候就会被GC,我们希望减少GC的次数,所以要经常手动清理ImageLoader中的缓存。
我们在AppBaseActivity中的onDesdroy方法中,执行ImageLoader中的clearMemoryCache方法以确保页面销毁时,把为了显示这个页面而增加的内存缓存清除。这样,即便到了下个页面要复用之前加载过的图片,虽然内存中没有了,根据ImageLoader的缓存策略,还是可以在本地磁盘中找到。
protected void onDestroy() {//回收该页面缓存在内存的图片imageLoader.clearMemoryCache();super.onDestroy();}
[读书笔记]《APP研发录》之App图片缓存设计相关推荐
- [读书笔记]大型分布式网站架构设计与实践.分布式缓存
前言:本书是对分布式系统架构涉及到的相关技术的一本科普书籍.由于很难作为开发参考,只能但求了解.所以通篇浅读,对分布式系统进行大致的了解.因为写的非常好,感觉非常有意思,自己也做不出总结.所谓的读书笔 ...
- [读书笔记]读《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》(一)...
第一条:了解Objective-C 语言的起源 Objective-C为C语言添加了面向对象特性,是其超集.Objective-C使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型.接收一条消 ...
- [读书笔记]《程序员代码面试指南》
栈和队列: 1.设计一个有getMin功能的栈 题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O( ...
- [读书笔记]多线程学习笔记
几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行的程序就是一个进程.当一个程序运行时,内部可能包含了多个顺序执行流,每个执行流就是一个线程. 线程和进程 所有运行中的任务通 ...
- 《App研发录》读书笔记
这本书基本上涵盖了移动开发中常见的关注点,之所以用关注点而不用技术点这个词是因为这本书并没有讲到具体的技术实现,但提供了行之有效的解决方案.读这本书的时候非常有感触,它很多的框架设计和解决方案与我实际 ...
- app研发录第一章笔记
app研发录第一章笔记
- App研发录读后总结(一)
2019独角兽企业重金招聘Python工程师标准>>> 通过一段时间的学习,阅读完了<App研发录>,此书同之前阅读的其他书,如 xx入门,xx提高不同,不是针对具体知识 ...
- 打造高质量的App——《App研发录》
当前移动开发从业人员数量处在一个野蛮增长的时代,鱼龙混杂的培训机构不断把一批批抱怨体力劳动又累又没钱的厨师和洗剪吹在四个月内包装成"两年以上开发经验"的Android或iOS工程师 ...
- 《App研发录》面世
转自包老师:http://www.cnblogs.com/Jax/p/4912606.html 古者富贵而名灭,不可胜记,唯倜傥非常之人称焉.故西伯拘而演<周易>,屈原放逐,乃赋<离 ...
最新文章
- php常见排序算去,PHP兑现常见排序算法
- JavaScript修改css中style,classname,cssText实例
- 从TCP协议的原理来谈谈rst复位攻击
- windows 下常用命令行
- 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第二部分)...
- 一种监控全部账户登陆及操作命令的方法
- python sqlsever 时间_Python sqlalchemy时间戳及密码管理实现代码详解
- osi参考模型(开放系统互连参考模型)
- pcb封装lib文件转pads_想做PCB达人?掌握这些PCB主流软件很关键!
- 【教程】javascript浏览器对象入门教程
- Recycle网格制式之瀑布流的实现
- 反装逼指南:掀起机器学习的神秘面纱
- OpenGL基础16:视角
- 威胁情报工具:更快?更聪明?
- qt下的跨目录多工程编译
- Backbone.js Wine Cellar 教程
- 今天,我们能否见证小米的伟大时刻——以专利为视角的创新能力分析
- Android GPS模块总结
- 基于JSP学生学籍管理系统
- git 清除用户名密码