Android 开源框架 ( 九 ) 图片加载框架---ImageLoader

news/2024/7/20 14:39:33 标签: 移动开发, 运维, 内存管理

一.引言

  Android的每一个App通常只拥有有限的系统资源,Android设备为每个App分配的内存大小是也是有上限的,并且,针对不同的设备配置所分配的内存大小也是不一样的,最小为16MB。图片会占用大量的内存,尤其是那些超清照片。所以图片加载时做容易造成安卓内存溢出的原因,而要解决这些问题还需要很多相关知识:
  1、多线程下载,线程管理。
  2、多级缓存架构设计和策略,内存缓存,磁盘缓存,缓存有效性处理。
  3、图片压缩,特效处理,动画处理。
  4、复杂网络情况下下载图片策略,例如弱网络等。
  5、内存管理,lru 算法、对象引用、GC回收等优化。

  Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用。

  Universal ImageLoader的GitHub地址:https://github.com/nostra13/Android-Universal-Image-Loader
  最近一次更新是在3年前,已经停止更新了。不推荐新项目中使用。

二.基本使用 

  1. 添加依赖

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

  2.Application初始化

    // 初始化参数
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .threadPriority(Thread.NORM_PRIORITY - 2)               // 线程优先级
                .denyCacheImageMultipleSizesInMemory()                  // 当同一个Uri获取不同大小的图片,缓存到内存时,只缓存一个。默认会缓存多个不同的大小的相同图片
                .discCacheFileNameGenerator(new Md5FileNameGenerator()) // 将保存的时候的URI名称用MD5
                .tasksProcessingOrder(QueueProcessingType.LIFO)         // 设置图片下载和显示的工作队列排序
                .writeDebugLogs()                                       // 打印debug log
                .build();

        // 全局初始化此配置
        ImageLoader.getInstance().init(config);

  3.基本使用

imageLoader.displayImage(Constants.IMAGES[position],holder.iv,options);

private DisplayImageOptions options = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.atguigu_logo)          // 设置图片下载期间显示的图片
            .showImageForEmptyUri(R.drawable.atguigu_logo)  // 设置图片Uri为空或是错误的时候显示的图片
            .showImageOnFail(R.drawable.atguigu_logo)       // 设置图片加载或解码过程中发生错误显示的图片
            .cacheInMemory(true)                        // 设置下载的图片是否缓存在内存中
            .cacheOnDisk(true)                          // 设置下载的图片是否缓存在SD卡中
            .displayer(new RoundedBitmapDisplayer(20))  // 设置成圆角图片
            .build();                                   // 创建配置过得DisplayImageOption对象;        

三.拓展了解

  ImageLoaderConfiguration是针对图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。
  ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),但是其实最终他们的实现都是displayImage(...)。
  DisplayImageOptions用于指导每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。

  1.ImageLoaderConfiguration的配置主要是全局性的配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。

private static ImageLoaderConfiguration config;
    config = new ImageLoaderConfiguration.Builder(context)// 开始构建 ,图片加载配置
            .threadPriority(Thread.NORM_PRIORITY - 2)// 设置线程优先级
            .threadPoolSize(3)// 线程池内加载的数量 ;减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
            .denyCacheImageMultipleSizesInMemory()// 设置加载的图片有多样的
            .tasksProcessingOrder(QueueProcessingType.LIFO)// 图片加载任务顺序
            .memoryCache(new WeakMemoryCache())//使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
            .memoryCacheExtraOptions(480, 800) // 即保存的每个缓存文件的最大长宽
            .memoryCacheSizePercentage(60)// 图片内存占应用的60%;
             .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())//使用HASHCODE对UIL进行加密命名
            .diskCacheFileNameGenerator(new Md5FileNameGenerator())// 将保存的时候的URI名称用MD5 加密
            .diskCacheSize(50 * 1024 * 1024) // 缓存设置大小为50 Mb
            .diskCache(new UnlimitedDiskCache(cacheDir))// 自定义缓存路径
            .diskCacheFileCount(100) // 缓存的文件数量
            .denyCacheImageMultipleSizesInMemory()// 自动缩放
            .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
            .memoryCacheExtraOptions(480, 800)//设置缓存图片时候的宽高最大值,默认为屏幕宽高;保存的每个缓存文件的最大长宽
            .defaultDisplayImageOptions(options)// 如果需要打开缓存机制,需要自己builde一个option,可以是DisplayImageOptions.createSimple()
            .writeDebugLogs() // Remove for release app
            .build();构建完成(参数可以不用设置全,根据需要来配置)        

  2.每一个ImageLoader.displayImage(...)都可以使用Display Options。

    private DisplayImageOptions options;
    options = new DisplayImageOptions.Builder()// 开始构建, 显示的图片的各种格式
                .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位
                .cacheInMemory(true)// 开启内存缓存
                .cacheOnDisk(true) // 开启硬盘缓存
                 .displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角,弧度为多少;避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
                .displayer(new FadeInBitmapDisplayer(100))// 是否图片加载好后渐入的动画时间
                .displayer(new SimpleBitmapDisplayer())// 正常显示一张图片 
                .bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型;使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
                .considerExifParams(true)// 是否考虑JPEG图像EXIF参数(旋转,翻转)
                .imageScaleType(ImageScaleType.EXACTLY)// 缩放级别
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//这两种配置缩放都推荐
                .build();// 构建完成(参数可以不用设置全,根据需要来配置)
    ImageLoader.getInstance().init(config);//初始化完成

  3.ImageLoader是显示图片的具体执行类,它有两个具体的方法displayImage loadImage(...)

ImageLoader.getInstance().displayImage(url, imageView, options);    

 

 

转载于:https://www.cnblogs.com/bugzone/p/ImageLoader.html


http://www.niftyadmin.cn/n/1203579.html

相关文章

多智能体强化学习

Multi-Agent Reinforcement Learning Concepts and Challenges Setting 多智能体强化学习通常有四种设定 Fully cooperative 完全合作关系,这种设定里面,Agents的利益一致,获得的奖励相同,有共同的目标。 Fully competitive 完…

C语言用 setjmp/longjmp 实现“闭包”

2019独角兽企业重金招聘Python工程师标准>>> C语言本身并不支持闭包,也就是说一个函数的局部变量在下一次调用的时候就会被重置(被重新赋初值,或者重新分配存储空间而是随机值);我在学习到setjmp用法的时候…

动手学深度学习之PyTorch神经网络基础

层和块 首先,回顾一下多层感知机 import torch from torch import nn from torch.nn import functional as F# Sequential类其实定义了一个特殊的module net nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X torch.rand(2, 20) net(X)tenso…

爬虫_古诗文网(正则表达式)

程序中请求到的和网页中内容不一样,但也是古诗,不是道是不是因为请求头的原因,使得网站推荐的古诗有差异 1 import requests2 import re3 4 headers Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6…

VIM显示乱码解决方案

字符集(charset) 代码点(code point) 以ASCII为例,它为每一个字符分配一个数字序号,比如A的编码点是65,所有代码点的集合就叫字符集 字符编码(char encoding) 字符编码是代码点的二进制存储格式。一个字符集会有多种存储格式,比如…

动手学深度学习之卷积和卷积层

卷积神经网络 卷积 从全连接到卷积 分类猫和狗的图片 使用一个还不错的相机采集图片(12M像素)RGB图片有36个元素使用100大小的单隐藏层MLP,模型有3.6B个元素 远多于世界上所有的猫和狗的总和(900M狗,600M猫) 我们在图片中找Waldo在哪里,…

小马笔记

引言 作为前端程序员,在走入前端这条道路一年之后,深深地感受到技术不精带来的屈辱、重复劳动带来的疲惫、知识众多带来的压力。这些原因都成为了推动我写前端101天的最原始的动力。接下来我会用101天的时间讲解101个前端知识点。希望对正在前端道路上奋…

卷积神经网络之卷积层中的多输入多输出通道

多个输入通道 参数图像可能有RGB三个通道转换为灰度会丢失信息 每一个通道都有一个卷积核,结果是所有通道卷积结果的和 用公式表达如下:这里cic_ici​就是输入的通道数,卷积核的个数应该和输入的通道数一样,不管我们的输入有多少…