ImageLoader如何用的更好

2024-05-25 04:48
文章标签 imageloader 更好

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

写在前面的话:相信每一个Android的app都少不了图片的加载,每一个Android程序员都少不了去写加载图片的代码,自己写的图片加载不知道大家有没有遇到很多问题,比如图片加载缓慢,同时加载多个图片时会有卡顿,加载大图时还会出现OOM等等各种问题,下面就为大家介绍一下我在项目中使用ImageLoader(开源框架)加载图片的用法和一些技巧

那么imageloader有那么特性呢?我这儿只说最常见的几个也是用的最多的几个,想要进一步了解imageloader原理请访问这篇博客。

imageloader的主要特性

1、内置线程池,使用多线程下载

2、图片可以是来自网络也可以是自己项目中的

3、使用缓存机制,内存缓存,文件系统缓存,sd卡缓存

4、各种自定义的配置,包括线程池的大小,图片的缓存,加载图片的质量,加载失败时默认的图片,甚至图片的格式等等,会在后面详细讲到

那么说了这么多特性,imageloader到底怎么用呢?毕竟我们不是搞理论的

看了网上一些人写的关于imageloader的博客,imageloader都是在activity中去初始化的,简单的初始化比如这样:

//创建默认的ImageLoader配置参数  
ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);  <pre name="code" class="java">//根据配置获取imageloader的实例
ImageLoader.getInstance().init(configuration);

 
大家看到getInstance()这个方法第一个想到的是什么?我想到的是imageloader它有可能是一个单例模式,即在整个项目中只有一个实例,查看它的源码,果然是,还发现它在初始化的时候做了同步处理 

imageloader实例获取的源码

public static ImageLoader getInstance() {if (instance == null) {//为null就去创建一个对象,否则返回已有的对象synchronized (ImageLoader.class) {//同步处理,防止多个地方同一时刻创建多个实例if (instance == null) {instance = new ImageLoader();}}}return instance;}

既然它是一个单例模式,那我们就没必要在每次使用它的时候都去在activity中调用一次创建配置,初始化的方法了,我们可以把它的初始化放到我们项目里自定义的MyApplication类中,这样在整个项目中只去实例化一次,在其他地方直接用就可以了。

MyApplication类中实例化的代码

File cacheDir = StorageUtils.getCacheDirectory(CONTEXT);  //缓存文件夹路径ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(CONTEXT).memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽.threadPoolSize(5) //  线程池内加载的数量,一般默认为3-5个.threadPriority(Thread.NORM_PRIORITY - 2) //  设置当前线程的优先级.denyCacheImageMultipleSizesInMemory()//设置拒绝缓存在内存中一个图片多个大小 默认为允许,(同一个图片URL)根据不同大小的imageview保存不同大小图片.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现.memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值.memoryCacheSizePercentage(13) // default.discCache(new UnlimitedDiscCache(cacheDir)) // default 可以自定义缓存路径  .discCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值.discCacheFileCount(100)  // 可以缓存的文件数量 .imageDownloader(new BaseImageDownloader(CONTEXT)) // default.imageDecoder(new BaseImageDecoder(false)) // default.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default.writeDebugLogs() // 打印debug log.build(); //开始构建ImageLoader.getInstance().init(config);//获取实例


其实imageloader还有很多的自定义配置参数,需要了解的请点击这里

那么我们如何在activity中使用呢?

imageloader加载网络图片

ImageView imageview = (ImageView)findViewByID(R.id.iv)
ImageLoader.getInstance().displayImage(url,imageView);
使用起来是不是很方便呢。。。

有时候我们需要监听加载的过程,比如开始加载,加载完成等,imageloader也给我们提供了很好的方法

imageView_2 = (ImageView) findViewById(R.id.iv_2);String url1 = "http://p0.so.qhimg.com/t015ecc8be48fc4220f.jpg";ImageLoader.getInstance().displayImage(url1, imageView_2, new ImageLoadingListener() {@Overridepublic void onLoadingStarted(String imageUri, View view) {Log.i(TAG, "开始加载......");}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {Log.i(TAG, "加载失败......");}@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {Log.i(TAG, "加载完成......");}@Overridepublic void onLoadingCancelled(String imageUri, View view) {Log.i(TAG, "取消加载......");}});

有时候我们需要在自己的activity中改变一下imageloader的配置参数,或者需要新增个配置参数,这个时候有2种办法,第一就是在MyApplication中去改,这样整个项目中的都改了,第二就是我们可以在用的地方去改,这样只在当前的activity中有效,整个项目中还是默认的配置

DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_launcher) // 设置图片在下载期间显示的图片.showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.drawable.ic_launcher) // 设置图片加载/解码过程中错误时候显示的图片.considerExifParams(true).cacheInMemory(false)// 设置下载的图片是否缓存在内存中.imageScaleType(ImageScaleType.NONE)// 设置图片以如何的编码方式显示.bitmapConfig(Bitmap.Config.ARGB_4444)// 设置图片的解码类型.build();// 构建完成ImageLoader.getInstance().displayImage(url1, imageView_2, options, new ImageLoadingListener() {public void onLoadingStarted(String imageUri, View view) {Log.i(TAG, "开始加载......");}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {Log.i(TAG, "加载失败......");}@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {Log.i(TAG, "加载完成......");}@Overridepublic void onLoadingCancelled(String imageUri, View view) {<span style="white-space:pre">	</span>Log.i(TAG, "取消加载......");}
});
加载本地图片
项目中大多数情况下是加载网络上的图片,但有时候也有可能去加载一张本地的图片,那么imageloader如何去加载一个本地的图片呢?

 /*** 从内存卡中异步加载本地图片*/public void displayFromSDCard(String uri, ImageView imageView) {// String imageUri = "file:///mnt/sdcard/image.png"; // from SD cardImageLoader.getInstance().displayImage("file://" + uri, imageView);}/*** 从assets文件夹中异步加载图片*/public void dispalyFromAssets(String imageName, ImageView imageView) {// String imageUri = "assets://image.png"; // from assetsImageLoader.getInstance().displayImage("assets://" + imageName,imageView);}/*** 从drawable中异步加载本地图片*/public void displayFromDrawable(int imageId, ImageView imageView) {// String imageUri = "drawable://" + R.drawable.image; // from drawables// (only images, non-9patch)ImageLoader.getInstance().displayImage("drawable://" + imageId,imageView);}
有一天你突发奇想,在imageloader加载图片的时候你想要让它给你返回一个bitmap的对象,你在某个地方要用到,强大的imageloader也提供了这样的方法

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(url);

其实imageloader的强大之处还远不止于此,开发过程中会遇到各种问题,就要靠我们去查看源码,找到解决的办法啦。。。


imageloader的jar包  点击下载

这篇关于ImageLoader如何用的更好的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid bla

【MobaXterm 远程连接工具】Windows下有没有xshell的更好的替代品?

每次间隔一段时间,xshell 总是提醒需要更新,很烦,点更新又没有用。 xshell 官方下载地址: https://xshell.en.softonic.com/ 本文要隆重推出一款集万千于一身的全能型终端神器——MobaXterm!这款神器是我师傅介绍给我的,在我第一次使用它的时候,就深深爱上它了,真的是相见恨晚,从此一发不不可收拾,自己电脑,公司电脑全部都安上了这款神器。 先说说这款

小渠道应该如何深度优化,才能达到更好的效果呢?

本篇给大家分享的是医疗行业搜索小渠道优化案例,一个月时间成本降低80%看看他是如何用做到的。 我所说的小渠道主要指的是搜狗,神马,360三个渠道。 很多时候大家只注重大搜渠道和信息流渠道,毕竟这些渠道消耗比较大,整体的转化量也比较大,是我们重点需要关注的,很少有去精细化运营小渠道的。的确小渠道不能雪中送炭,但是往往能够锦上添花,关键时刻,小渠道是降低总成本的有效利器。 那么小渠道应该如何

月考成绩查询哪个软件更好用?

老师,这个职业总是伴随着无尽的忙碌,是时候该为我们这些辛勤的园丁减轻一些负担了,科技的便利性为我们提供了许多解决方案。易查分小程序就是一个很好的例子,能够帮助老师们在成绩管理上实现高效与便捷。 开学的第一个月,月考成绩的发布无疑是老师们的一项重要任务。用易查分,老师们可以轻松发布考试成绩。这个平台的设计非常人性化,操作简单,只需几步设置,成绩就能安全、准确地发布给每一位学生。家长和学生也

【数据分析案例】从XGBoost算法开始,更好地理解和改进你的模型

案例来源:@将门创投 案例地址: https://mp.weixin.qq.com/s/oeetxWMM3cr1BgvIaGU54A 1. 目标:使用xgb评估客户的信贷风险时,还希望得出揭示 2. xgb全局特征重要性度量

90后不买房 你的生活会更好 20年后的房子像白菜

90后不买房 你的生活会更好 20年后的房子像白菜  理由:请不要 做啥奴了 潇洒一生行啊  拒绝背贷 当资本家的韭菜 有人说:不买房咋活  答:可以啊租房   又说:租房这么贵 20年后的钱都能买了 答:那为啥你还在那个城市工作呢 可不可以去2-3线城市生活呢 又说:为啥去2-3线啊 哪里没有那么多高工资 没啥医疗啊 答:你拿到的工资全是你的么 1w去除生活费4000吧就剩6000

企业架构对现代化组织的价值:改进流程、提高效率和更好地决策

在当今充满竞争和不确定性的商业环境中,企业必须不断寻求优化运营和提升决策能力的途径。企业架构(EA)作为一种系统化的管理框架,正在成为现代企业提升效能的关键工具。它不仅为组织提供了一种清晰的视角,以便更好地理解和管理复杂的业务流程,还通过优化资源配置、改进流程管理和加强决策支持,帮助企业在动态环境中保持竞争优势。 本文将探讨企业架构如何通过改进流程、提升效率和增强决策能力,成为现代企业在复杂

Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解 一、介绍

一、介绍  Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。所以,如果你的程序里需要这个功能的话,那么不妨试试它。因为已经封装好了一些类和方法。我们 可以直接拿来用了。而不用重复去写了。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程缓存,内存溢出等很多方面。 二、具体使用 一个好的类库的

如何通过更好的采样参数来提高 LLM 响应率

深入研究使用温度、top_p、top_k 和 min_p 进行随机解码 当你向大型语言模型 (LLM) 提出问题时,该模型会输出其词汇表中每个可能标记的概率。 从该概率分布中抽取一个标记后,我们可以将选定的标记附加到我们的输入提示中,以便 LLM 可以输出下一个标记的概率。 temperature该采样过程可以通过著名的和等参数来控制top_p。 在本文中,我将解释并直观地展示定义 LLM

Scott Brinker:Martech中的AI会让买家体验更好还是更糟?这取决于…….

Martech中的AI会让买家体验更好还是更糟?  你怎么知道自己正处于炒作周期的顶峰?当手段大于目的。 Martech专业人士和营销运营领导者正被推动将人工智能应用于营销——将其用于任何事情!——相信人工智能的自动化和加速,尤其是生成式人工智能,一定会产生有益的结果。这让我想起了一个老笑话,一个过于乐观的孩子兴奋地在一大堆马粪中挖掘,「这里一定有一匹小马!」 好消息是,市场营销和销