android异步加载图片类(续)-universal-image-loader详解

之前写过一篇android异步加载图片类 ,后来接触了一个开源项目universal-image-loader,听说淘宝也是用这玩意

发现自己写的那个异步加载类太简单了,虽然功能是实现了,但是很多优化的问题都没有解决

比如:

同一个ui加载同一张图,会出现只加载一张,其他的加载不了

加载多图的时候会有oom等问题

现在来说说universal-image-loader

特点:

多线程的图像加载
的可能性的宽调谐对ImageLoader的配置(线程池的大小,HTTP选项,内存和光盘高速缓存,显示图像,以及其他)
的图像的可能性中的缓存存储器和/或设备的文件器系统(或SD卡)
可以“听”加载过程中
可自定义每个显示的图像调用分隔的选项
Widget支持
Android 1.5以上支持

使用方法:(我自己封装了一个类ImgConfig使用,方便一些)

只需两步即可加载网络图片:

一、初始化

ImgConfig.initImageLoader();

二、

ImgConfig.showUserSImg(imgUrl, imageview); //图片的url,要显示的view

以下是我自己写的ImgConfig,仅供参考:

public class ImgConfig extends ImageLoader { private static DisplayImageOptions options_corner; private static DisplayImageOptions options_square; private static AnimateFirstDisplayListener animateFirstDisplayListener = new AnimateFirstDisplayListener(); /** * @param url 服务器的文件名 * @param imageView * 显示方形图片 S for Square */ public static void showUserSImg(String url, ImageView imageView) { ImageLoader.getInstance().displayImage(url, imageView, options_square, animateFirstDisplayListener); } /** * @param url 服务器的文件名 * @param imageView * 圆角 C for Corner */ public static void showUserCImg(String url, ImageView imageView) { ImageLoader.getInstance().displayImage(url, imageView, options_corner, animateFirstDisplayListener); } /** * 初始化图片读取方式 */ public static void initImageLoader() { DisplayImageOptions options_corner = new DisplayImageOptions.Builder() .showImageOnLoading(ImgHandler.ToCircular(R.drawable.defult_head)) // 加载中 .showImageForEmptyUri(ImgHandler.ToCircular(R.drawable.defult_head)) // 空uri .showImageOnFail(ImgHandler.ToCircular(R.drawable.defult_head)) // 失败时 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) .displayer(new RoundedBitmapDisplayer(10)) // 展现方式:圆角 .resetViewBeforeLoading(true) .imageScaleType(ImageScaleType.EXACTLY) // new FadeInBitmapDisplayer(300) 渐现 .build(); options_square = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.defult_head) .showImageForEmptyUri(R.drawable.defult_head) .showImageOnFail(R.drawable.defult_head) .cacheInMemory(true) .cacheOnDisc(true) .considerExifParams(true) .displayer(new FadeInBitmapDisplayer(100)) // 展现方式:渐现 .resetViewBeforeLoading(true) .imageScaleType(ImageScaleType.EXACTLY) .build(); // This configuration tuning is custom. You can tune every option, you // may tune some of them, // or you can create default configuration by // ImageLoaderConfiguration.createDefault(this); // method. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( ContextUtil.getInstance()) .threadPriority(Thread.NORM_PRIORITY) //线程池的数量 .denyCacheImageMultipleSizesInMemory() // 不同大小图片只有一个缓存,默认多个 .tasksProcessingOrder(QueueProcessingType.LIFO) // 设置图片下载和显示的工作队列排序 .discCache(new LimitedAgeDiscCache(new File(Constant.SAVE_IMG_PATH), new Md5FileNameGenerator(), 7 * 24 * 60 * 60)) // 7天自动清除,按秒算 // .writeDebugLogs() // Remove for release app .imageDownloader( //或许你的服务器有特定的加载图的方式,在这里实现 new BaseImageDownloader(ContextUtil.getInstance()) { @Override public InputStream getStream(String imageUri, Object extra) throws IOException { return super.getStream(imageUri, extra); } @Override protected InputStream getStreamFromNetwork( String imageUri, Object extra) throws IOException { HttpURLConnection conn = createConnection( imageUri, extra); int redirectCount = 0; while (conn.getResponseCode() / 100 == 3 && redirectCount displayedImages = Collections .synchronizedList(new LinkedList()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } }

特别提示以下 .disCache() 和 .imageDownloader

因为我不想要自动帮我加密文件,所以我.disCache() 里面的加密方法 new Md5FileNameGenerator()

换成了

new FileNameGenerator() { @Override public String generate(String imageUri) { return FileUtil.getFileName(imageUri); } }

服务器有自己的加载方式,我把加载.imageDownloader的加载图片方法换了

new BaseImageDownloader(ContextUtil.getInstance()) { @Override public InputStream getStream(String imageUri, Object extra) throws IOException { return super.getStream(imageUri, extra); } @Override protected InputStream getStreamFromNetwork( String imageUri, Object extra) throws IOException { HttpURLConnection conn = createConnection( imageUri, extra); int redirectCount = 0; while (conn.getResponseCode() / 100 == 3 && redirectCount

总结: universal-image-loader 这个开源项目很好用,
研究了一下源码,有很多启发,扩展性很好,值得我们学习
官方提供的例子: universal-image-loader例子

点击复制链接 与好友分享!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
上一篇:Android平台实现开机调试system_process
下一篇:Android学习之——杂项
相关文章

调用系统程序打开指定的图片

Android 开机图片/文字/动画 修改

分享一个Android图片转换类 1. Bitm

Android异步下载网络图片(其一)

Android异步下载网络图片(其二)

Android异步下载网络图片(其三)

演化理解 Android 异步加载图片

Android imageView图片按比例缩放

Android如何获取网络上的图片

Android图片动画播放

图文推荐
android异步加载图片类(续)-universal-image-loader详解
Android中数据存储方
android异步加载图片类(续)-universal-image-loader详解
Android OTA升级包制
android异步加载图片类(续)-universal-image-loader详解
Android从普通发送和
android异步加载图片类(续)-universal-image-loader详解
Android开发:Parall

分类:默认分类 时间:2013-04-25 人气:0
本文关键词:
分享到:

相关文章

  • Android-Universal-Image-Loader框架学习 2012-01-03

    先来看一下Android-Universal-Image-Loader框架的用法; 1、初始化ImageLoaderConfiguration(全局的,在整个application中初始化configuration,配置缓存、加载线程等)、 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( getApplicationContext()) .threadPriority(Thread.NORM_PRIO

  • Android-Universal-Image-Loader异步加载图片框架学习研究 2013-03-31

    GitHub下载地址 https://github.com/nostra13/Android-Universal-Image-Loader 先来看一下Android-Universal-Image-Loader框架的用法; 1、初始化ImageLoaderConfiguration(全局的,在整个application中初始化configuration,配置缓存、加载线程等) ImageLoaderConfiguration config = new ImageLoaderConfigurati

  • Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用 2013-12-19

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 大家好!差不多两个来月没有写文章了,前段时间也是在忙换工作的事,准备笔试面试什么的事情,现在新工作找好了,新工作自己也比较满意,唯一遗憾的就是自己要去一个新的城市,新的环境新的开始,希望自己能尽快的适应新环境,现在在准备交接的事情,自己也有一些时间了,所以就继续给大家分享Android方面的东西。 相信大家

  • Android-Universal-Image-Loader 架构梳理 2014-05-30

    源码地址:点击打开链接 Android-Universal-Image-Loader的广泛使用,我们有必要好好研究下他,对于我们使用,和进步都有很多的帮助, 下载图片线程。 6、Downloader,下载任务模块,该模块是负责下载的,网络连接通过两种方式,一个是HttpClient,一个是HttpURLConnection,前者是apache封装的一个类,会保存cookie等信息,支持需要校验用户登录信息的后台服务,后者则不支持,该模块还包括网络慢时候的处理和网络连接失败时候的处理。 7、cac

  • android图片缓存框架Android-Universal-Image-Loader(二) 2013-12-02

    这篇打算直接告诉大家怎么用吧,其实这个也不是很难的框架,大致使用过程如下: // 获取缓存图片目录 File cacheDir = StorageUtils.getOwnCacheDirectory(activity, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( activity).memoryCacheExtraOptions(800, 760) //

  • Android学习小Demo(19)利用Loader来实时接收短信 2014-09-19

    之前写过一篇文章《Android学习小Demo(13)Android中关于ContentObserver的使用》,在里面利用ContentOberver去监测短信URI内容的变化。我们先来回顾一下,是如何利用ContentOberver来监测短信内容的变化的。 1)要自定义一个类,比如SmsContentObserver,继承ContentObserver,并且实现其onChange方法。 2)在onChange方法中去查询对应Uri,比如短信收件箱的内容,并将对应的记录利用Handler发送到

  • (android高仿系列)今日头条 --新闻阅读器 (三) 完结 .总结 篇 2012-12-04

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据碰到的知识点和问题,并且罗列出这些东西的知识点和使用方法。如果你单纯的把做好的一个DEMO拿去改改用用,那样,你永远不知道里面用到的内容是涉及到什么知识点,用什么方法实现,那样就没有多少提升价值而言了。 近期都是在通过开发文档把以前的一些东西重新过一遍,看好多网友都催促想要新版本的,那我就在这里先把

  • Android 中查看内存的使用情况集常用adb命令 2013-03-03

    1. 在IDE中查看Log信息 当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下: D/dalvikvm: , , , GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类: GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集 GC_FOR_MALLOC:在内存已满的情况下分配内存,此时系统会暂停程序并回收内存 GC_HPROF_DUMP_HEAP:创建FPFOR文件来分析Heap时所造成的垃圾收集 GC_EXPLICIT: 程序调用了垃圾收集函数S

  • Android学习之--杂项 2013-04-10

    new关键字和newInstance()方法的区别 a. new可以调用带参数的构造函数,newInstance不可以 b. newInstance: 弱类型。低效率。只能调用无参构造。 new: 强类型。相对高效。能调用任何public构造。 c. new是自己下厨,做饭自己吃。newInstance是外面吃别人做给你吃。 自己做可以保证安全,而且可以有多个口味,什么酱,放多少自己定。new对象不会因为找不到类而出异常,而且你还可以调用多个构造函数,按照自己口味去new对象,去做一份符合自己口

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.052 (s). 10 q(s)