Android学习记录(二)--第三方图片库Universal Image Loader的使用。

ITIL-IT运维管理-概述 ITIL-IT运维管理-概述 概述 IT服务管理(ITSM)是一套帮助企业对IT系统的规划、研发、实施和运营进行有效管理的方法,是一套方法论。ITSM起源于ITIL(IT Infrastructure Library,IT基础架构标准库),ITIL是CCTA(英国国家电脑局)于1980年开发的一套IT服务管理标准库。它把英国在IT管理方面的方法归纳起来,变成规范,为企业的IT部门提供一套从计划、研发、实施到运维的标准方法。 中文名 IT服务管理 外文名 ITService Management 专家 阅读详情

前言

项目需要大规模的从后端下载图片在app上显示。前期使用了Google推荐的BitmapFun,而没有考虑使用第三方的库,实际使用过程中,发现需要大段的修改源码,成本极高。最近使用Universal Image Loader的第三方开源库,实际效果比较理想。


使用

转载一篇出自xiaanming的博客(http://blog.youkuaiyun.com/xiaanming/article/details/26810303)

主要的配置和基本的实现在本文中都有提及。


坑

实际使用的时候还是遇到的很多坑。

这里总结一下。

问题1:

刷新闪屏的问题

.showImageOnLoading(R.drawable.empty_photo) // resource or drawable
在Loader Image Options 如果配置了该项,那么加载图片资源时,都会先加载该图,然后才会加载资源图。这样就会造成如下拉刷新闪屏的情况。

如何处理呢。

下面是建议的解决方法:

对于ListView,GridView,RecyclerView等,需要编写自己的ViewHolder,将资源的URI绑定到Image的Tag上。

下次刷新时,判断记录的Tag与URI是否一致,如果一致就不重新加载。

if (!music.albumArtUrl.equals(holder.ivPoster.getTag())) {
    holder.ivPoster.setTag(music.albumArtUrl);
    imageFetcher.displayImage(music.albumArtUrl, holder.ivPoster, ImageLoaderOption.getOption());
}
 

问题2:
ListView和GridView提供了
setOnScrollListener(new PauseOnScrollListener(mImageFetcher, true, true))
的方法滑动时,可以禁止加载图片。
对于RecyclerView没有此方法,这里没有其他方法,只能自己写一个禁止刷新的类。
代码如下即可解决。
public class NewPauseOnScrollListener extends RecyclerView.OnScrollListener {

    private ImageLoader imageLoader;

    private final boolean pauseOnScroll;
    private final boolean pauseOnSettling;
    private final RecyclerView.OnScrollListener externalListener;

    public NewPauseOnScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnSettling) {
        this(imageLoader, pauseOnScroll, pauseOnSettling, null);
    }

    public NewPauseOnScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnSettling,
                                    RecyclerView.OnScrollListener customListener) {
        this.imageLoader = imageLoader;
        this.pauseOnScroll = pauseOnScroll;
        this.pauseOnSettling = pauseOnSettling;
        externalListener = customListener;
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        Log.e("Recycle Scroll","state:"+newState);
        switch (newState) {
            case RecyclerView.SCROLL_STATE_IDLE:
                imageLoader.resume();
                break;
            case RecyclerView.SCROLL_STATE_DRAGGING:
                if (pauseOnScroll) {
                    imageLoader.pause();
                }
                break;
            case RecyclerView.SCROLL_STATE_SETTLING:
                if (pauseOnSettling) {
                    Log.e("Recycle Scroll","Pause");
                    imageLoader.pause();
                }
                break;
        }
        if (externalListener != null) {
            externalListener.onScrollStateChanged(recyclerView, newState);
        }
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if (externalListener != null) {
            externalListener.onScrolled(recyclerView, dx, dy);
        }
    }


问题3:

按照上面的两个方法编写后,发现快速下滑的时候出现图片位置不对的情况。

本来应该是空图的情况下显示的图为其他图标。

在快速滑动的时候,实际发现TAG的标签绑定对应的POSITION,可能会错位。

从代码角度看,就算是错位,刷新的图片也应该会重新加载空图。

这里看一下错误的源码:

if (music.albumArtUrl==null)
{
    holder.ivPoster.setImageResource(R.drawable.ic_broken_image);
}
else
{
    if (!music.albumArtUrl.equals(holder.ivPoster.getTag())) {
        holder.ivPoster.setTag(music.albumArtUrl);
        imageFetcher.displayImage(music.albumArtUrl, holder.ivPoster, ImageLoaderOption.getOption());
    }
错误就在红色标注的这行。
Universal Image Loader是一个单实例多Task加载的插件。在Image Pause的时候,还是会有队列加入到图片加载队列中,等待刷新完成后才会加载。
而setImageResource是立即执行的,这就造成时序上的错位。空图先加载,错位的非空图后加载。
解决的办法是空图也使用ImageLoader的方法进行加载。这样时序就不会错乱了。
 
 




iOS反编译-hook微信之艾特所有人 all。 阅读详情

相关推荐

使用 arxiv-sanity 实时跟进自己研究领域的Paper

介绍 arxiv.org是一个非常大的预印本资源库,里面有大量的最新的论文,但缺点是浏览、搜索和排序不是很方便。这个资源库每天会更新大量的论文,如果通过手动搜索和浏览则效率很低,高引用的好文章难以及时的找到并阅读,造成时间的浪费。因此 使用 ...

John's Blogs 8280

Android 项目关于图片用到的第三方库

1.Matisse用于拍照选择图片。2.Glide用于给控件添加图片支持gif图的添加。3.Compressor用于截切压缩图片。

天使乱红的博客 708

WPF数据可视化:LiveCharts自定义X轴与Y轴的5个实战技巧(附完整代码)

本文详细介绍了在WPF应用中使用LiveCharts进行数据可视化时,自定义X轴与Y轴的5个核心实战技巧。内容涵盖精确控制刻度步距、深度定制视觉样式、实现多轴布局对比、优化显示空间以及构建响应式动态轴,并提供了完整的C#和XAML代码示例,帮助开发者创建专业且用户体验出色的图表。

moss5的博客 692

《使用第三方库来显示jpeg图片》

《使用第三方库来显示jpeg图片》----------------------------------------------------------------------------------------------------------------           基于itop4412开发板 ubuntu14.4------------------------------------...

DGY1223的博客 1885

行人重识别技术(Re-ID)概述、研究现状以及相关数据集下载

ReID技术概述什么是ReID一般流程Re-ID特点研究现状难点数据集reid常用数据集以及下载链接评价指标实现思路研究方式基于表征学习基于度量学习基于局部特征全局特征切片姿态基于视频序列RQEN基于GANCamStyleDG-NetGAN总结对比未来方向建议文献 什么是ReID 行人重识别是指利用计算机视觉技术,判断在不同时间段、不同监控下出现的行人图像是否属于同一人员的技术。行人重识别是最近几年在视频分析领域下热门的研究领域,可以看做是人脸识别应用的拓展。现在大街上的监控较多,由于设备质量、成像光线、.

留缘的博客 1万+

【QMIX】一种基于Value-Based多智能体算法

文章目录1. QMIX 解决了什么问题(Motivation)2. QMIX 怎样解决团队收益最大化问题(Method)2.1 算法大框架 —— 基于 AC 框架的 CTDE(Centralized Training Distributed Execution) 模式 QMIX 是一种基于 Value-Based 的多智能体强化学习算法(MARL),其基本思想来源于 Actor-Critic 与 DQN 的结合。使用中心式学习(Centralized Learning)分布式执行(Distributed

qq_38638132的博客 9860

android图片传输三方框架,Android开发三种第三方图片加载的框架

最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录。现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧。一、Picasso1,首先在项目中引入picasso(以gradle为例),也就是app的build.gradlecompile 'com.squareup.picasso:picasso:2.5.2'2,加...

weixin_30821291的博客 378

2025趋势:经济学研究中AI多智能体系统的6大架构方向(AI应用架构师必藏)

多智能体系统(MAS)由多个相互作用的智能体组成,每个智能体具备自主决策能力、感知环境的能力和与其他智能体通信的能力。微观行为的精细化建模:智能体可被赋予异质的偏好函数、信息集和决策规则,模拟真实市场的多样性动态交互的涌现性分析:通过智能体间的局部互动(如交易、合作、竞争),观察宏观经济现象的涌现过程反事实政策实验:在虚拟环境中安全测试极端政策(如负利率、全民基本收入)的连锁反应实时自适应调整:智能体可通过机器学习持续优化策略,模拟经济系统的演化特性。

AI 领航者的博客 1424

Android 6种加载网络图片的第三方详解

一. Glide加载 Glide.with(this).load("http://p0.qhimg.com/t015f3654b694ad2f8a.jpg").into(imageView); 效果图 compile files('libs/glide-3.7.0.jar') 二. Picasso Picasso.with(getApplicationConte...

冯旭的博客 8844

【扫地机器人测试】

本测试方案旨在系统性评估扫地机器人的核心功能、性能指标、可靠性及用户体验,验证产品是否符合设计规范、行业标准及市场需求。通过多维度、全场景的测试,精准定位产品缺陷与优化空间,为产品迭代提供数据支撑,确保上市产品的质量稳定性与用户满意度。

xuhuaiyaun的博客 1372

拆解一个800G光模块:手把手带你认识里面的MT插芯和光纤阵列(FA)

本文详细拆解了800G光模块中的关键组件MT插芯和光纤阵列(FA),揭示了并行光学技术如何实现高速数据传输。通过显微镜下的精密观察,展示了MT插芯的高精度构造和光纤阵列的连接奥秘,同时解析了高精度研磨工艺对光信号传输的重要性。这些微型组件是高速收发模块实现800Gbps带宽的核心技术。

weixin_30839881的博客 1551

android 图片的相关第三方开源库

Takaphoto 博客地址 http://blog.youkuaiyun.com/ss1168805219/article/details/53317310bitmap的六种压缩方式,Android图片压缩 博客地址 http://blog.youkuaiyun.com/harryweasley/article/details/51955467android图片压缩的三种方式 博客地址 http://blog

a136447572的专栏 996

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

WW、forever的博客 803

基于Eclipse的Android应用开发实战:从MVC架构到完整项目构建

Android应用开发的核心在于理解其架构模式与工程化实践。经典的MVC(Model-View-Controller)架构清晰地分离了数据、界面与逻辑,为应用的可维护性奠定了基础。通过模块化设计与异步处理机制,开发者能够构建响应迅速、用户体验良好的应用。在工程实践中,数据持久化方案如SQLite数据库与SharedPreferences,以及多媒体处理如VideoView的视频播放,是实现核心功能的关键技术。这些技术共同支撑了在线教育、内容消费等复杂场景的应用开发。本文以“博学谷”这一综合性学习应用为例,详

weixin_30628801的博客 308

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

universalImageLoader,picasso,glide,fresco图片选择库选择分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] universalImageLoader Picasso Fresco 特性 Glide测试 简单总结 综合 在图片加载这块,picasso,glide,universalImageLoader,fresco 这几个库算是目前做好的四个库了。本博客仅仅作为笔记记录,仅代

阳光灿烂的日子的博客 1266

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android图片传输三方框架,Android ImageLoader第三方框架解析

本文实例为大家分享了Android ImageLoader框架的使用方法,供大家参考,具体内容如下1.准备工作1)导入universal-image-loader-1.9.5.jar到项目中2)创建MyApplication继承Application,在oncreate()中初始化ImageLoaderpublic class MyApplication extends Application {...

weixin_29698641的博客 312

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android学习记录(十八)-url转义继续填坑之旅

前面的blog其实很坑。。。 先来说几个概念: URI :Uniform Resource Identifier,统一资源标识符; URL:Uniform Resource Locator,统一资源定位符; URN:Uniform Resource Name,统一资源名称。 其中,URL,URN是URI的子集。 Web上地址的基本形式是URI,它代表统一资源标识符。有两种形式: UR

MAGICYANG的专栏 3886

Android学习记录(十) 弹框阻塞处理

需求:需要做一个弹框,弹框完成后再进行其它数据处理。 开始的时候在主线程做了for循环来处理弹框触发和相应的逻辑,结果发现无论是alertdialog还是popupwindow都无法真正做到阻塞主线程处理。 开始的时候有了个奇葩的想法,想写标志位来阻塞主线程。。。弹框结束后来改写标志位,结果你懂的。。。(ui全阻塞。。。) 现在后来发现其实问题的根源就在于主线程for循环,就不应该用for循

MAGICYANG的专栏 2686

Android学习记录(十二) http之base/digest鉴权。

说下背景,我们实现的http的文件下载是基于webdav协议的。 这个肯定是需要鉴权的~ android 5.1不再推荐使用apache的client,今天努力想尝试一下用httpurlconnection替换一下。 大家可以到stackoverflow搜索一下,目前httpurlconnection还不支持digest鉴权,只支持base的鉴权。 下面是httpurlconnec

MAGICYANG的专栏 2404

Android学习记录(十三) http之digest鉴权之填坑6.0。

背景: android 6.0.1 的手机发现使用webdav下载文件实效,httpclient.execute get的时候出现: CrashHandler: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1                                                        

MAGICYANG的专栏 2286

Android学习记录(二十二)-Android WEBDAV MKCOL的使用

先上需求: 使用webdav上行文件之前,需要创建目录。 坑在哪里: http 4.0以后http不再支持excutemethod的方法。不能直接调用mkcol方法进行目录创建。 解决的办法: 查看开源库: https://github.com/lookfirst/sardine的实现: 使用下面的代码自己创建mkcol的类。 static class HttpMkCol ex

MAGICYANG的专栏 1943

Android学习记录(二十八)--Android apache httpclients的使用。

1.历史原因:      Android当前不在支持APACHE的一套内容,开始推自己的网络请求库,基本等同于okhttp。但是非常令人失望的是,这个库目前看支持是不全的,对于网络鉴权,只支持BASE的网络鉴权,不支持DIGEST鉴权,因此APACHE的库依然还需要使用。但是GOOGLE比较恶心,在新的COMPILESDK为6.0的时候,不再允许引入APACHE的基本库。    现在的GRAD

MAGICYANG的专栏 1759

Android学习记录(二十六)-Android toolbar使用遇到的坑。

为什么要使用Toolbar? 因为actionbar只能虚浮于视图上方,当你想把一个控件悬浮在actionbar上方时,就没招了。(可以通过addview的方式悬浮,但是有焦点问题,其它的控件没法获取焦点) 怎么办?使用Toolbar。 toolbar的基础用法请自行搜索。本文只描述遇到的坑。 本文是基于sdk 21的,23的坑没有填。 1.当自己设置toolbar样

MAGICYANG的专栏 1581

Android学习记录(二十)-viewpager切换数据加载的简单优化。

背景:默认的viewpager是要加载前后两个view的数据的。 如果你有定时轮询其它页面的网络请求时。。。。没必要的开销有时候会很坑,尤其是弱网。。。 方法2种: 1.什么修改包的默认属性这种不适合偶们。 2.在不可见的时候,网络的定时器不要起,或者关掉就o了。 复写:setUserVisibleHint方法。   @Override     public void s

MAGICYANG的专栏 1336

Android学习记录(二十三)-Android Fragment onBackPressed的处理。

需求: 在fragment嵌入了自定义的弹框操作,这个时候回退按键需要实现取消弹框,而系统的回退则是退出activity。 然而fragment没有自己的onBackPressed的处理,如何去实现呢? 实现的办法是: 1.activity去设置一个fragment的监听接口,监听fragment的弹框事件,当弹框发生时,设置一个弹框发生标志位。 2.activity复写onBackPr

MAGICYANG的专栏 1167

Android学习记录(十四) digest鉴权的文件播放

首先这是一个相对来说比较复杂的流程,为什么呢? 因为 1.intent调第三方数据是没有办法鉴权的,这个需要pass. 2.mediaplay的方案只能将数据缓存,读取缓存的数据,对于电影资源文件大小都是巨大的,这个方案也被pass了。 目前从我的实践看,只能通过webview的方式来进行鉴权的视频播放。 先来看鉴权, player.setHttpAuthUse

MAGICYANG的专栏 868
上一篇: ANDROID学习记录(1)--FragmentTabHost 和Fragment的切换。
下一篇: Android学习记录(三)Android的代码混淆及反编译验证
magicyang1234
博客等级 码龄13年 65粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值