Android应用开发:ImageLoader小陷阱——同一个URI
来源:互联网 发布:mac如何添加照片 编辑:程序博客网 时间:2024/05/17 03:37
引言
ImageLoader是一个被广泛使用的用于图片加载的开源项目,项目地址:https://github.com/nostra13/Android-Universal-Image-Loader
关于ImageLoader的使用,作者的README写的已经非常详细了,我在这里就不再赘述。
Android应用都是分别运行在各自的dalvik虚拟机中,而由于手机内存大小的局限性,Android系统在设计之初就对每个应用所运行的虚拟机能够使用的内存进行了严格的限制(现在Android正转向ART的运行环境中,即便是运行环境发生了改变,这样的内存限制规则还是存在的)。AOSP的现行标准是,以720P的手机来说,若手机自身带有1G内存,则每个应用可用内存限制在96MB。若有2G内存,则限制为192MB(Google解释说这个内存足够5张800万像素的位图了)。一旦某个应用总体使用的内存超过了所在手机的限制,将引发OOM(Out of Memory)错误,这个错误对于应用程序来说是致命的,能够直接导致程序崩溃。这正是ImageLoader产生的背景,Android官方的开发指导上边用很大的章节(http://developer.android.com/intl/zh-cn/training/displaying-bitmaps/index.html)介绍了在开发过程中如何妥善处理Bitmap的加载以防止OOM的发生,亦或是从程序优化角度讲也是有必要的。即使你仔细看完了Android官方对于Bitmap的那些指导性文档,我也强烈建议你使用ImageLoader或Volley进行图片加载,拥抱开源是最正确的选择。
所谓陷阱
所谓陷阱其实更应该描述为开发过程中容易发生的误会。ImageLoader在之前的版本中对相同的URI并没有进行过滤,也就是说,对同一个URI进行多次请求,也就能得到多次完成的监听事件。而这在网络请求中,有可能造成多余操作,所以其作者在听取了使用者建议后在后续版本的更新中对相同URI的请求进行了过滤,也就是说同一个URI的请求,如果只是简单的使用
ImageLoader.getInstance().loadImage(uri, size, listener)
进行图片加载的话,无论请求多少次,都只会收到一次listener监听事件。所以说,如果你的应用中在同一列表或界面中有可能出现同样URI的图片,那么在使用ImageLoader的时候就需要注意了,如果按照默认的用法,那么最终只会有一个位置能够正常显示图片,其他的会是默认状态。
这样,即使对同一个URI进行多次请求,listener监听事件也不会被过滤,每一个请求都会获得相应的回应。
解决问题
解决办法ImageLoader的作者曾在用户开辟的issue中阐述过,不过随着版本的变迁,产生了小小的变化(其实就是一个类名的Rename)。
NonViewAware aware = new NonViewAware(size, ViewScaleType.CROP);ImageLoader.getInstance().displayImage(uri, aware, listener);
这样,即使对同一个URI进行多次请求,listener监听事件也不会被过滤,每一个请求都会获得相应的回应。
1 0
- Android应用开发:ImageLoader小陷阱——同一个URI
- Android HybridApp开发——自定义Schema的URI应用
- 开发中的小陷阱
- Android开发笔记——Uri.parse的详细资料
- Android应用开发小知识点
- Android 图片加载 —— ImageLoader
- Android——自定义简化版ImageLoader
- Android之加载网络图片—ImageLoader
- ImageLoader应用
- Android 开发常用Uri介绍
- Android&&Unity交互——同一个apk
- android 开发过程中,两个包名相同的项目如何上传到同一个应用商城
- 开发Android小应用——短信控制的浮动窗
- Android应用开发的几个小技巧
- Android 应用开发使用小技巧总结
- Android——ContentProvider和Uri详解
- android应用类开发小结--android google map小应用
- 【转】【第三方包】【Android Universal Imageloader】关于displayImage方法中URI参数的问题
- android工具---使用笔记
- VS2010 更改MFC标题栏图标和生成的执行文件图标
- Linux命令集
- 导入Excel
- 快来DIY自己的固件吧——N系列固件DIY详细教程(7.27更新RK2918)
- Android应用开发:ImageLoader小陷阱——同一个URI
- Send-Mail: Warning: Inet_protocols: IPv6 Supp
- ActionBar样式修改
- jquery学习笔记之一二-------入门及基础核心
- dialog中处理鼠标事件
- 图像检索之纹理检索~~大数据检索
- PyQt4 - (2) 第一印象
- UVA - 101 The Blocks Problem
- 结构型设计模式---享元模式(Flyweight)