图片缓存是App开发中最常见的,本篇博文给大家带来自己手写的图片缓存框,大致的思路很简单,首先从内存中获取图片,如果内存中没有,就从手机本地进行获取,如果还没有,就从网络访问进行获取。...所以,我们在ImageLoader中只需要暴露一个方法loadImage(),外部只需要调用这个方法就可以完成图片缓存的所以逻辑 //加载图片到对应的控件 public void loadImage(String...key, ImageView view) { synchronized (view) { this.imageView = view; //检查缓存里是否有...R.layout.activity_main); ImageView imageView = (ImageView) findViewById(R.id.image); ImageLoader...imageLoader = ImageLoader.getmInstance(this); imageLoader.loadImage(url,imageView); } }
ImageLoader在github上的地址:https://github.com/nostra13/Android-Universal-Image-Loader 配置: 1.在app的buildgradle...click "+i); } }); } @Override protected void onDestroy() { //回收缓存在内存中的图片...ImageLoader.getInstance().clearMemoryCache(); super.onDestroy(); } private...showImageOnFail(R.drawable.ic_launcher_background)//发生错误显示的图片 .cacheInMemory(true)//载的图片是否缓存在内存中....cacheOnDisk(true)//载的图片是否缓存在sdcard中 .considerExifParams(true
@Override public Thread newThread(Runnable r) { return new Thread(r, "ImageLoader...核心思想:当缓存满时,优先淘汰近期最少使用的缓存对象 先看源码:(推荐使用supprt-v4包中的LruCache,地址在E:\adt\sdk\sources\android-19\android\.../+/android-4.1.1_r1/luni/src/main/java/libcore/io/DiskLruCache.java 但是下载下来好像要改好多东西,所以我就在Universal-ImageLoader...getUsableSpace:获取sd卡的大小和剩余空间 这两个函数的实现方法在代码包里面有,就不细说 2.DiskLruCache缓存的添加 缓存的添加是通过Editor来完成的。...LruCache的Snapshot表示内存缓存的副本,这里的Snapshot仅仅指保存了三个参数的一个对象 至此,ImageLoader已经大体实现。
我们思考下 Imageloader类中需要维护的变量 使用内存缓存 ,肯定需要LruCache ,其中LruCache中key保存的是图片的路径,value则对应相应的图片 。这是缓存的核心类。.../** * 图片缓存的核心类 key为图片的路径 value为图片 */ private LruCache mLruCache ; /** * 线程池
/** * 静态成员变量 */ private static NewImageLoader mImageLoader ; /** * 图片缓存的核心类...Handler mUIHandler ; /** * 私有化构造函数,防止外部通过new实例化 * * 我们希望线程数和图片加载的策略可以由用户指定,我们在实例化ImageLoader...传入这两个参数 */ private NewImageLoader(int threadCount , Type type){ // 初始化ImageLoader的变量...@Override protected int sizeOf(String key, Bitmap value) { // 计算缓存对象的大小
BTW: 说一下BitmapFactory.Options的inJustDecodeBounds属性,当参数设置为true时,BitmapFactory只会解析...
效果图参考微信 加载图片应满足一下三个目标 避免OOM 用户操作UI尽可能的流畅 选择适当的图片加载策略 避免OOM A.根据图片的显示大小压缩图片 B.使用缓存 LruCache UI操作流畅
伪代码如下 class Imageloader{ getView(){ 目标:根据URL查找Bitmap 1.首先从缓存LruCache中查找对应的Bitmap —> 找到直接返回
isPremultiplied() : boolean 像素点是否是premulitplied格式存储 isRecycled() : boolean 图片是否已经被回收 prepareToDraw() 为绘制做缓存...final int getBytesCount() { return getRowBytes() * getHeight(); } LruCache 基于LinkedHashMap的一种经典的内存缓存模型...它是用强引用控制的缓存。可以设置缓存的大小,个数。可以统计命中率,读写次数。它是线程安全的。从做缓存的角度来说,要比WeakHashMap要好很多。 api 12 以上可以直接使用。...它是推荐给开发者使用的文件缓存的类。从名称上很好理解,文件系统中的Lru缓存。它的源码地址。 它的原理 利用LinkedHashMap在内存中记录文件缓存的最近访问顺序。...可以控制的变量: 缓存路径。建议选择App的cache目录下; cache版本。cache版本升级的时候会把旧的缓存全部清除; cache大小。cache的大小要小于缓存路径下的可有 日志条数。
图片加载的核心处理类 ImageLoader , 全局只能有 一个实例来加载图片,我们采用单例模式,保证状态的统一。
根据我们的策略:加载图片首先从缓存中查找,如果找到直接返回回调UIHandler的handleMessage()设置图片,如果缓存中没有则开启任务去加载图片并添加到缓存。.../** * 加载图片的核心方法 * 实例化UIHanlder * 首先从缓存中获取,如果获取不到, * * @param path * @param...imageView.setImageBitmap(bitmap); } } }; } // 从缓存中获取图片
ImageLoader API 详细介绍,具体内容如下 在ImageLoader中有以下几个不同的构造器: /** * 注意: 次构造器不支持下载进度提示功能 * @param context...* @param withCache 是否支持缓存 * false--不带缓存 * true--支持缓存功能,默认缓存路径在外置存储缓冲目录中的picasso-big-cache...} /** * 支持下载进度提示,以及设置缓存路径 * @param context * @param listener 下载进度监听器 * @param cachePath 缓存路径字符串...picasso.setIndicatorsEnabled(BuildConfig.DEBUG); picasso.setLoggingEnabled(BuildConfig.DEBUG); } /** * 支持下载进度提示,以及设置缓存路径为默认路径...picasso-big-cache * @param context * @param listener 下载进度监听器 * @param withCache 是否支持缓存 */ public
说一下通过线程加载图片的过程: 首先根据ImageView获得适当的压缩的宽和高 然后计算inSampleSize,用于压缩图片 接着将图片添加到缓存 最后mUIHandler发送消息更新图片。
Android Imageloader的配置的实现代码 ImageLoader 优点 (1) 支持下载进度监听 (2) 可以在 View 滚动中暂停图片加载 通过 PauseOnScrollListener...(3) 默认实现多种内存缓存算法 这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等...(4) 支持本地缓存文件名规则定义 实现代码: /** * 初始化ImageLoader */ public static void initImageLoader(Context context...("cacheDir", cacheDir.getPath()); // 创建配置ImageLoader(所有的选项都是可选的,只使用那些你真的想定制),这个可以设定在APPLACATION里面,设置为全局的配置参数....memoryCacheExtraOptions(480, 800) // Can slow ImageLoader, use it carefully (Better don't use it)
###4.1增加双缓存类 package com.xpf.sdk.imageloader; import android.graphics.Bitmap; /** * Created by xpf...、SD卡缓存和双缓存分别实现接口 package com.xpf.sdk.imageloader; import android.graphics.Bitmap; /** * Created by...6.外部调用及设置缓存策略 private void loadImage() { ImageLoader imageLoader = new ImageLoader();...// 使用内存缓存 imageLoader.setmImageCache(new MemoryCache()); // 使用SD卡缓存 imageLoader.setmImageCache...当用户需要增加一种新的缓存策略时,我们只需新建一个实现ImageCache接口等待类就可以了,这样就实现了千变万化的缓存策略,并且新扩展的策略不会影响导致ImageLoader类的修改,这正是体现了“对修改关闭
"http://site.com/image.png", "file:///mnt/sdcard/img/image.jpg") ImageLoader imageLoader = ImageLoader.getInstance...该方法会确保删除已加载图片缓存在内存中的其他尺寸的缓存。...设置内存中缓存的大小。...• 指定在本地的最大缓存大小。...• 指定在本地缓存的文件数量。
true 磁盘缓存到应用的内部目录 / false 磁盘缓存到外部存 */ public static void init(final Context context, int...(当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求 等等) ImageLoader.clearDiskCache()//清除磁盘缓存...(必须在后台线程中调用) ImageLoader.clearMomoryCache(View view) //清除指定view的缓存 ImageLoader.clearMomory() // 清除内存缓存.../DiskCacheStrategy.SOURCE :缓存图片源文件/DiskCacheStrategy.RESULT:缓存修改过的图片/DiskCacheStrategy.ALL:缓存所有的图片,默认...true 磁盘缓存到应用的内部目录 / false 磁盘缓存到外部存 */ @Override public void init(Context context, int
// 1.获取ImageLoader实例 ImageLoader imageLoader = ImageLoader.getInstance...初始化ImageLoader imageLoader.init(configuration); // 4. ...开启缓存后默认会缓存到外置SD卡如下地址(/sdcard/Android/data/[package_name]/cache).如果外置SD卡不存在,会缓存到手机.缓存到Sd卡需要在Manifest文件中进行如下配置... (Unlimited cache不限制缓存) 21. ...Use it if your cached files are of about the samesize.设置总缓存文件数量,当到达警戒值时,删除最久之前的缓存。
前言 在上一篇文章中,我们一起深入探究了 Volley 的缓存机制,通过源码分析对缓存的工作原理进行了了解,这篇文章将带大家一起探究「Volley 图片加载的实现」,图片加载跟缓存还是有比较紧密的联系的...,建议大家先去看下:Android Volley 源码解析(二),探究缓存机制。...的用法 ImageLoader 其实是对 ImageRequest 的封装,它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求,因此 ImageLoader 要比 ImageRequest...imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { @Override public...---- 相关文章 Android Volley 源码解析(一),网络请求的执行流程 Android Volley 源码解析(二),探究缓存机制
Universal ImageLoader Universal ImageLoader的缓存(MemoryCache)本质是一个LinkedHashMap。 ?...当我们使用Universal ImageLoader加载图片时,根据URI和目标View的尺寸组成一个memoryKey,根据memoryKey我们在内存缓存(MemoryCache)中寻找相应的Bitmap...**这里就是ImageLoader内存缓存缺陷的关键 ** : 至此,这个被我们remove掉的Bitmap,将离开我们的控制范围。我们既不能将它recycle掉,也不能将它复用。...Universal ImageLoader的内存缓存缺陷: 我们无法判断内存缓存中的Bitmap,是否正被ImageView显示着,导致我们无法对离开缓存的Bitmap做任何操作,只能放任它被系统自动回收...总结: 相较于Universal ImageLoader朴实的使用LinkedHashMap,Glide将内存缓存分为了两层(active&memory)。
领取专属 10元无门槛券
手把手带您无忧上云