Android Imageloader图片异步加载

Imageloader是一个在android平台下简单的下载、显示、缓存空间的图片加载库.

异步下载网络图片并可以在UI线程更新View,使用二级缓存控制即内存缓存、本地SD卡缓存.

重要更新:
1.5.8-SNAPSHOT

添加加载图片的动画效果

1.5.7

ImageTagFactory 使用工厂方法实现更加方便测试.

本次升级请使用ImageTagFactory.getInstance代替new ImageFactory().

添加图片加载过程中的回调接口,更多的方法请参考SettingsBuilder

添加

修改大量图片展示过程中滚动的一些问题

当URL为null的时候添加错误图片

Fix
for loading images behind redirects (max 3)

1.5.6

clean
up不需要在manifest中注册service,所有的操作在BasicFileManager的线程中完成.

1.5.5

修改bug

添加直接加载图片的DirectLoader(不能在主线程使用)

1.5.2

缓存中添加预览图支持,可以从缓存中获取大图的预览图

1.5.1

使用多并发的加载

参考Android SDK guidelines修改SDCARD中的缓存文件目录

使用LruBitmapCache

Imageloader library使用

从Demo 开始相对好点.

具体步骤:

  1. in the
    application class

添加下列代码初始化Imageloader,SettingsBuilder中提供设置缓存和网络连接的能力.

@Override

public void
onCreate() {

super.onCreate();

LoaderSettings settings = new
SettingsBuilder()

.withDisconnectOnEveryCall(true).build(this);

imageManager = new ImageManager(this,
settings);

}

public static
final ImageManager getImageManager() {

return imageManager;

}

lru缓存设置选项

默认的缓存使用软引用,但是由于系统的内存管理机制、空间限制可能经常被回收掉,限制缓存的性能,lru缓存解决了这个问题,如果你的应用中需要展示很多的小图片建议使用.

settings = new
SettingsBuilder()

.withCacheManager(new
LruBitmapCache(this)).build(this);

thumbnailImageLoader = new ImageManager(this, settings);

LruBitmapCache默认使用%25的内存缓存也可以从构造函数中自行配置

int
PERCENTAGE_OF_CACHE = 50;

settings = new
SettingsBuilder()

.withCacheManager(new LruBitmapCache(this,
PERCENTAGE_OF_CACHE)).build(this);

thumbnailImageLoader = new ImageManager(this, settings);

其他设置

Imageloader使用UrlConnection获取图片,两个重要的请求的参数需要配置一下connectionTimeout & readTimeout

SettingsBuilder
builder = new SettingsBuilder();

Settings
settings = builder.withConnectionTimeout(20000)

.withReadTimeout(30000).build(this);

连接超时的时间是初始化连接的时间

读取超时是说已经建立连接获取数据的时间

在Acitivty,fragment
或Adapter中使用

如果想在imageview中加载图片只需要调用的Application的静态方法获得Imageloader再调用其中的load方法

下面的代码是Imageview是一个tag的时候的加载过程

ImageTagFactory
imageTagFactory = new ImageTagFactory(this, R.drawable.bg_img_loading);

imageTagFactory.setErrorImageId(R.drawable.bg_img_notfound);

private
ViewBinder getViewBinder() {

return new ViewBinder() {

@Override

public boolean setViewValue(View view,
Cursor cursor, int columnIndex) {

// Build image tag with remote image URL

ImageTag tag = imageTagFactory.build(cursor.getString(columnIndex));

((ImageView) view).setTag(tag);

imageLoader.load(view);

return true;

}

};

}

使用ImageTagFactory配置图片的显示的大小同时开始显示原图.Imageloader将依次从内存缓存,sdcard,网络获取

清空SDCARD缓存

如果需要清空SDCARD缓存调用

imageManager.getFileManager().clean();

Imageloader的初始化过程中可以使用settings
builder配置缓存的过期时间(默认时间为7天)

In the Androidmanifest.xml

主要是声明两件事情:权限和注册清空缓存的service(从1.5.6以后清空sdcard缓存的service不是必须的了)

<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission
android:name="android.permission.INTERNET" />

<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />

<service
android:name="com.novoda.imageloader.core.service.CacheCleaner"
android:exported="true">

<intent-filter>

<action
android:name="com.novoda.imageloader.core.action.CLEAN_CACHE" />

</intent-filter>

</service>

缓存预览图片(可选项)

缓存预览图片的这个东西主要是考虑有比较多的图片的时候展示,先加载小兔再加载大图.预览图也可以缓存.

在图片加载之前配置image tag或配置ImageTagFactory

// Image tag
after normal settings

imageTag.setPreviewHeight(100);

imageTag.setPreviewHeight(100);

imageTag.setPreviewUrl(previewUrl);

imageView.setTag(imageTag);

getImageManager().getLoader().load(imageView);

// If small and
large image have same URL, configure with the ImageTagFactory

imageTagFactory
= new ImageTagFactory(this, R.drawable.loading);

imageTagFactory.setErrorImageId(R.drawable.image_not_found);

imageTagFactory.usePreviewImage(THUMB_IMAGE_SIZE,
THUMB_IMAGE_SIZE, true);

// On bind

ImageView
imageView = (ImageView) view;

String url =
cursor.getString(columnIndex);

imageView.setTag(imageTagFactory.build(url));

MyApplication.getImageManager().getLoader().load(imageView);

DirectLoader

ImageLoader提供直接通过url下载的图片的工具类,调用该方法请使用非UI线程

Bitmap myImage = new DirectLoader().download(url);

如果没有找到图片改方法会抛出ImageNotFoundException

添加一个动画

这是动画显示

ImageTagFactory
imageTagFactory = new ImageTagFactory(this, R.drawable.bg_img_loading);

imageTagFactory.setErrorImageId(R.drawable.bg_img_notfound);

Animation
fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);

imageTagFactory.setAnimation(fadeInAnimation);

获取Imageloader
library的途径:

使用maven

需要在你的pom文件中配置

<dependency>

<groupId>com.novoda.imageloader</groupId>

<artifactId>imageloader-core</artifactId>

<version>1.5.6</version>

</dependency>

获得一个.jar文件

可以直接引入工程方便使用最新的版本

http://search.maven.org/remotecontent?filepath=com/novoda/imageloader/imageloader-core/1.5.6/imageloader-core-1.5.6.jar

项目结构:

core:maven上的java工程

demo:Android 的测试项目

acceptance:添加了Robotium的内部测试工程

使用maven构建工程

mvn clean install

IntelliJ

当一个maven
peoject导入进去

项目地址: https://github.com/novoda/ImageLoader

【jar包】图片的异步加载--【 Imageloader】的更多相关文章

  1. Android中图片的异步加载

    转: 1.  为什么要异步加载图片 下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验 2.  SoftReference的作用 栈内存—引用 堆内存—对象 Eg: Object ...

  2. WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

    原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统, ...

  3. BitmapImage处理网络图片,例如阿里云获取的图片。异步加载到需要显示的控件上。提升速度非常明显。

    想直接把网络图片赋给控件,又要下载又要缓存,速度非常慢.不流畅. 需要进行处理,异步加载会显著提升速度.方法如下: public static BitmapImage ByteArrayToBitma ...

  4. gridcontrol 图片列异步加载

    在gridview中指定一列,将ColumnEdit设置成pictureEdit 在使用showDialog这里窗体后,需要frm.Dispose()将资源释放 1.将该列的UnboundType属性 ...

  5. android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)

    转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...

  6. 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载

    apple sample lazytableimages 1,首先设置横向显示的uitableview self.customTableview.transform = CGAffineTransfo ...

  7. tomcat的添加及jar包和jQuery的加载

  8. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

  9. Android图片异步加载

    原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/A ...

随机推荐

  1. 它们的定义UIAlertView

    code4App有很多伟大的上方UI特效代码,,好牛逼啊,这效果,太炫了,哇,怎么自己写不出来.事实上,再炫的特效,都是依据苹果系统的框架而来,假设我们了解系统框架实现的原理,也就能写出属于自己自己定 ...

  2. Redis源代码分析(二十)--- ae事件驱动

    事件驱动的术语出现更频繁.听起来非常大的,今天我把Redis内部驱动器模型来研究它,奖励的感觉啊.一个ae.c主程序,加4文件的事件类型,让你彻底弄清楚,Redis是怎样处理这些事件的. 在Redis ...

  3. Linux内核分析(七)----并发与竞态

    原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主 ...

  4. hdu4717 The Moving Points 三分法

    题意:坐标系上有n个点,每个点的坐标和移动方向速度告诉你,速度方向都是固定的.然后要求一个时刻,使得这个时刻,这些点中最远的距离最小. 做法:三分法,比赛的时候想不到.考虑两个点,如果它们走出来的路径 ...

  5. Angular规范

     只记录一些自己未曾用过,但觉得对以后的项目有帮助的规范 一 Javascript闭包 把Angular组件包装到一个立即调用函数表达式中(IIFE). 为什么?:把变量从全局作用域中删除了,这有助于 ...

  6. hdu2844 &amp; poj1742 Coin ---多重背包--两种方法

    意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求. 在不超过M如果是,我们用这些硬币,有多少种付款的情况下,.那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬 ...

  7. java 中间String分类

    String a = "aaa"; 用这样的方式的时候java首先在内存中寻找"aaa"字符串.假设有.就把aaa的地址给它 假设没有则创建 String a ...

  8. wikioi 1002 旁路

    意甲冠军:这个问题刚开始的问题,有错误的含义,原桥始建于一条直线.无论多么遥远. 思维:dfs寻求答案的第一个问题.然后做最小生成树,双方不能大桥将设置INF即可了.然后假设用到INF的边就加上0即可 ...

  9. C#并行和多线程编程

    5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq   5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线 ...

  10. ABP日志管理

    ABP日志管理 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP ...