UniversalImageLoader小试牛刀

2023-11-06 06:59

本文主要是介绍UniversalImageLoader小试牛刀,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以前都是使用xUtils,觉得xUtils集成的Db、View、Http、Bitmap这四个模块的功能已经非常全,没必要再引入新的开源模块增加维护的难度以及不可控bug的可能性。

那么先看看bitmapUtils是怎么说的。


  • BitmapUtils模块:

  • 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
  • 支持加载网络图片和本地图片;
  • 内存管理使用lru算法,更好的管理bitmap内存;
  • 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等…

  BitmapUtils bitmapUtils = new BitmapUtils(this);// 加载网络图片bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");// 加载本地图片(路径以/开头, 绝对路径)bitmapUtils.display(testImageView, "/sdcard/test.jpg");// 加载assets中的图片(路径以assets开头)bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");// 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));

其实到这里,需要补充说明一下图片的三级缓存,按照读取速度来分, MemoryCache DiskCache NEtRecs,自然读取内存的速度是最快的,储存卡文件次之,网络资源最慢。
三级缓存的存在一来解决频繁的网络请求,减轻服务器压力,二来实现更好的用户体验,节省用户宝贵的30M流量。那么这个逻辑顺序是,当内存中有缓存,则优先读取内存,否则读取储存卡资源,并将其加载到缓存,如果一上两者都不存在,则直接请求网络资源,加载进内存缓存,并且数据保存到储存卡本地,以供后用。这里说明一下,不是说有的内容都加载到内存中缓存的,大家都知道图片资源比较耗空间,而安卓的中端机型本来内存就捉襟见肘,所以建议以Lru实现的缓存 不要超过1/8 或者1/6,毕竟不是只运行咱这一个app。
上面说了那么多废话,开始说下uniersal_imageloader。之前看别人的博客,说京东淘宝的大神们也在用,用了都说好… … 心里还是痒痒了,于是就出来这篇,这句还是废话。
看下它的运行机制,其实还是三级缓存的那些东东… …

不过需要强调的是,它的每一个图片的加载和显示都在独立的线程,不管是读取本地还是请求网络。其实xUtils也是这么做的,但是通过异步的方法。
说下imageloader的使用吧

使用步骤:

1、欲善其事,必利其器。加载图片之前,先要做初始化配置,其实就是实例化一个全局的ImageLoader对象,同时传入图片加载缓存的配置,ImageLoaderConfiguration封装了基本的配置信息,比如加载图片事用的线程池大小,线程的优先级,内存缓存大小,是否支持同一图片的多尺寸缓存(默认是支持的,可以手动关闭),还有缓存的命名规则等等。

2、走马上任。配置完后,通过
ImageLoader.displayImage(String uri, ImageView imageView, DisplayImageOptions options)
DisplayImageOptions用于指导每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。


话不多说,上实战!
  1. 继承Application,完成ImageLoaderConfiguration。为啥?Application为应用的整体提供基础环境。

    public class BaseApplication extends Application {@Override
    public void onCreate() {super.onCreate();initImageLoader( getApplicationContext());
    }public void initImageLoader(Context context) {//自定义缓存文件目录File cacheDirectory = StorageUtils.getOwnCacheDirectory(context, "ImageLoader/cache");ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(480, 800) //设置内存缓存的最大宽和高.threadPoolSize(5)//线程池的大小,以目前手机配置来说,一般3-5比较合适吧.threadPriority(Thread.NORM_PRIORITY - 2) //线程的优先级.denyCacheImageMultipleSizesInMemory() //关闭多规格缓存图片,为啥?浪费空间.diskCacheFileNameGenerator( new Md5FileNameGenerator()) //图片名称采用md5加密,为啥?保护隐湿.memoryCacheSize(1024 * 1024 * 5) //内存最大缓存值 5M.diskCacheSize(1024 * 1024 * 50) //储存卡最大缓存值 50M.tasksProcessingOrder(QueueProcessingType.LIFO) //设置任务的处理顺序.discCache( new UnlimitedDiscCache(cacheDirectory))//使用cacheDirectory自定义存储卡缓存.imageDownloader( new BaseImageDownloader(context, 1000 * 3, 1000 * 15)) //连接超时时间,读取小时时间.writeDebugLogs() //写调试信息.build(); //配置完毕ImageLoader.getInstance().init(config);//全局初始化完毕。
    }
    

    }

  2. 配置一般的listview 应用环境 ,关键在于 Adapter的处理。

    private class MyBaseAdapter extends BaseAdapter{@Overridepublic int getCount() {return imageUrls.length;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view;ViewHolder mHolder;if (convertView != null) {view  = convertView;mHolder = (ViewHolder) view.getTag();} else {view = View.inflate(MainActivity.this, R.layout.item_listview, null);mHolder = new ViewHolder();mHolder.image = (ImageView) view.findViewById(R.id.iv_items_image);mHolder.text = (TextView) view.findViewById(R.id.tv_items_text);view.setTag(mHolder);}imageLoader.displayImage(imageUrls[position], mHolder.image, options);mHolder.text.setText("我是你的小苹果");return view;}}
    
imageLoader.displayImage(imageUrls[position], mHolder.image, options);//设置imageview的图像资源, 关键是后边的option,它决定了对图像的处理过程。
options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub)//加载时显示的图片.showImageForEmptyUri(R.drawable.ic_empty) //无效链接时显示的图片.showImageOnFail(R.drawable.ic_error) //加载失败时的图片.cacheInMemory(true) //加载进缓存.cacheOnDisk(true) //保存到本地.displayer( new RoundedBitmapDisplayer(20) ) //圆角展示,倒角半径.build();

3.权限处理 WRITE_EXTERNAL_SDCARD + INTERNET

4.application节点配置
最后老套路,直接上代码。

这篇关于UniversalImageLoader小试牛刀的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355127

相关文章

MutationObserver小试牛刀

参考文档 https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver 简介 MutationObserver 接口提供了监视对 DOM 树所做更改的能力。 MutationObserver() 构造函数——是 MutationObserver 接口内容的一部分——创建并返回一个新的观察器,它会在触发指定 DOM 事件时,

android平台UniversalImageLoader(异步加载大量图片

摘要:第四种ImageGallery效果如图: 测试关键代码: public class ImageGalleryActivity extends BaseActivity{private Gallery gallery;private DisplayImageOptions options;public void onCreate(Bundle savedInstanc

NodeJs小试牛刀--聊天室搭建

最近研究聊天室功能,准备用nodejs实现。下面是自己的尝试!! nodejs的安装这里就不详细赘述了。 程序创建 引入required模块 var express = require('express');var app = express();var http = require('http').Server(app); 创建监听端口 http.listen(8000, f

iPhone开发之UITableView的小试牛刀 利用MVC模式从plist文件读取数据并字典转模型的格式实现

新建一个具有simple  VIew的工程,并把相关图片拉进资源文件夹 在Supporting  files文件夹下新建work.plist文件,编辑内容如下图: 在工程下新建model文件夹,并在文件夹内新建model类Hero 根据文件的字典属性编辑Hero.h如下: //// Hero.h// 作业整理//// Created by apple on 15/

OrangePi AIpro小试牛刀-目标检测(YoloV5s)

非常高兴参加本次香橙派AI Pro,香橙派联合华为昇腾打造的一款AI推理开发板评测活动,以前使用树莓派Raspberry Pi4B 8G版本,这次有幸使用国产嵌入式开发板。 一窥芳容 这款开发板搭载的芯片是和华为昇腾的Atlas 200I DK A2同款的处理器,功耗低至8W 默认AI CPU和Control CPU 比例1:3, 芯片名称 310B1:表示芯片算

python小试牛刀编写批处理初步

bat越来越觉得不好用,取字符串是非常的麻烦,于是我打算用python开始编写,现在的雏形是这样的. #!/bin/env python#encoding: utf-8#"Non-ASCII character '\xe6' in file"import sysimport osprint("arg length:"+str(len(sys.argv)))# sys.argvfil

Python爬虫小试牛刀

学了几日Python爬虫,做了一个无聊的爬虫。。。 # -*- coding: utf-8 -*-import urllib.requestimport repage = urllib.request.urlopen("https://movie.douban.com/")cnt = page.read().decode("utf-8")#首次过滤name = re.findall(r

Ansible小试牛刀

Ansible 利用ssh通道管理多台主机,以实现批量操作主机的目的,适合运维开发测试使用。 使用步骤如下: 1、安装 yum install python-pip pip install ansible 2、配置ssh免密通道 ssh-keygen 生产公钥、私钥 ssh-copy-id root@192.168.37.122 远程复制公钥 vim ~/.ssh/config Host mk1

UniversalImageLoader源码解析之 DiskCache

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/70472306 FileNameGeneratorDiskCachetryLoadBitmap UnlimitedDiskCacheBaseDiskCacheLimitedAgeDiskCacheLruDiskCache getsaveremoveclear

Armeria 小试牛刀

HelloService.thrift 定义服务接口 namespace java com.example.thriftservice HelloService {string hello(1:string name)} 使用thrift-0.9.3.exe 工具,命令:thrift-0.9.3 -r --gen java HelloService.thrift 在当前文件