概要: Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是实现可重复使用的异步图像加载、缓存和显示。所以,如果你的程序里需要这个功能的话,使用它,因为已经封装好了一些类和方法。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面。
     功能介绍:

A:多线程图片加载;
         B:灵活更改ImageLoader的基本配置,包括最大线程数、缓存方式、图片显示选项等;
         C:图片异步加载缓存机制,包括内存缓存(软引用)及本地缓存;
         D:对加载过程实现监听和事件处理;

E:能够配置加载图片的显示选项,包括图片圆角处理和加载完成显示动画等;

使用步骤:

1、下载jar包universal-image-loader-x.x.x-with-sources.jar并导入工程

2、配置Manifest文件,添加网络请求和访问外部存储的权限,因为要进行网络请求和本地缓存

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

3,实现自定义的MyApplication类,并初始化ImageLoader,注意要在Manifest的Application标签注明

android:name=".MyApplication",否则还是使用的默认的Application类。

<application
android:name=".UILApplication"

  

package com.wjt.day36_01_uillistview;

import java.io.File;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap.CompressFormat; public class UILApplication extends Application{ @Override
public void onCreate() {
super.onCreate();
initImageLoader(getApplicationContext());
}
private void initImageLoader(Context context) {
File cacheDir = context.getExternalCacheDir();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(
getApplicationContext())
.memoryCacheExtraOptions(480, 800)
// max width, max height,即保存的每个缓存文件的最大长宽
.discCacheExtraOptions(480, 800, CompressFormat.PNG, 100, null)
// 设置缓存的详细信息,最好不要设置这个
.threadPoolSize(5)
// 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(4 * 1024 * 1024))
// 你可以通过自己的内存缓存实现
.memoryCacheSize(4 * 1024 * 1024)
.discCacheSize(50 * 1024 * 1024)
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
// 将保存的时候的URI名称用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100)
// 缓存的文件数量
.discCache(new UnlimitedDiscCache(cacheDir))
// 自定义缓存路径
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(
new BaseImageDownloader(context, 5 * 1000, 30 * 1000))
.build();// 开始构建 ImageLoader.getInstance().init(configuration);
}
}

 4,配置图片显示选项——DisplayImageOptions 的设置(我这里以listview为例,并创建自定义的适配器) 

//部分代码
public class MyGridViewAdapter extends BaseAdapter {
private String[] arrUrls = null;
private LayoutInflater inflater = null;
private DisplayImageOptions options = null;
private ImageLoader imageLoader = null; public MyGridViewAdapter(Context context, String[] arrUrls) {
this.arrUrls = arrUrls;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error).cacheInMemory(true)
.cacheOnDisc(true).considerExifParams(true)
.displayer(new FadeInBitmapDisplayer(500))
.displayer(new RoundedBitmapDisplayer(90)).build();
imageLoader = ImageLoader.getInstance();
}

 重要的几个方法如下:

5,在要产生图片的地方使用displayImage()方法,一般选择三个参数或者四个参数的

public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder mHolder;
if (convertView == null) {
mHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_gridview_uil, parent,
false);
mHolder.imageView_item_icon = (ImageView) convertView
.findViewById(R.id.imageView_item_icon);
mHolder.progrssBar_item = (ProgressBar) convertView
.findViewById(R.id.progressBar_item); convertView.setTag(mHolder);
} else {
mHolder = (ViewHolder) convertView.getTag();
} // 使用UIL框架加载图片
imageLoader.displayImage(arrUrls[position],
mHolder.imageView_item_icon, options,
new ImageLoadingListener() { @Override
public void onLoadingStarted(String imageUri, View view) {
mHolder.progrssBar_item.setVisibility(View.VISIBLE);
} @Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
mHolder.progrssBar_item.setVisibility(View.GONE);
} @Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
mHolder.progrssBar_item.setVisibility(View.GONE);
} @Override
public void onLoadingCancelled(String imageUri, View view) {
// TODO Auto-generated method stub }
}); return convertView;
}

  效果图如下:

  

 

使用UIL(Universal-Image-Loader)异步加载图片的更多相关文章

  1. Android之ListView异步加载图片且仅显示可见子项中的图片

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

  2. Android 实现异步加载图片

    麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的. 今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还 ...

  3. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  4. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  5. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  6. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  7. ListView异步加载图片,完美实现图文混排

    昨天参加一个面试,面试官让当场写一个类似于新闻列表的页面,文本数据和图片都从网络上获取,想起我还没写过ListView异步加载图片并实现图文混排效果的文章,so,今天就来写一下,介绍一下经验. Lis ...

  8. 软引用SoftReference异步加载图片

    HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了. 机制 ...

  9. Android之使用Android-AQuery异步加载图片(一)

    第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...

随机推荐

  1. jira attachement directorey,workflow---extention.

    workflow---extention. https://confluence.atlassian.com/jirakb/jira-miscellaneous-workflow-extensions ...

  2. HBase协处理器统计表数据量

    1.Java代码实现 import org.apache.hadoop.hbase.client.coprocessor.AggregationClient; import org.apache.ha ...

  3. 大数据情况下linux的配置

    一:配置的大纲 主要的配置有几个方面: 主机名 IP 网络映射 增加新用户 给新用户root的权限,方便实验 关闭防火墙 安全子系统需要关闭 二:主机名的配置 命令:vi /etc/sysconfig ...

  4. IOS 手势事件的冲突

    关于手操作需要强调几点: UIImageView默认是不支持交互的,也就是userInteractionEnabled=NO ,因此要接收触摸事件(手势识别),必须设置userInteractionE ...

  5. IAdaptable和IAdaptableFactory(转)

    先记在这里,回头研究下. 原文:http://blog.csdn.net/mini_snow/article/details/3877379 1. 简介和简单的实现 IAdapteable实际上在Ec ...

  6. Java进制转换

    其他转10进制 System.out.println(Integer.parseInt("10", 2));// bin System.out.println(Integer.pa ...

  7. 几个简单的html+css+js题目

    1.页面中有一图片,请在下划线处添加代码能够实现隐藏该图片的功能 <img id="pic" src="door.jpg" width="200 ...

  8. Asp.net Mvc4默认权限详细(下)

    前言 菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止. 本文主要在于探讨一 ...

  9. 解决在VMware中安装64位系统时“此主机具有虚拟化支持能力的,但虚拟化技术被禁用”的方法

    您已经配置此虚拟机使用64位客户操作系统.然而,64位操作系统不可用.此主机具有虚拟化支持能力的,但虚拟化技术被禁用.这通常是因为虚拟化技术已经在BIOS /固件设置或禁用或主机没有权限改变此设置. ...

  10. Java日期时间处理常用方法

    虽然是老生常谈,但整理出来还是有点用. 1.由字符串时间得到Date类型时间 // 由字符串时间得到Date类型时间 public static Date getDateFrom(String str ...