Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍

一,前言:为什么要引入Android-Universal-Image-Loader?

众所周知,简单的几个ImageView载入几个图像资源、或者这几个图像资源是从本地载入时无需考虑过多直接载入就可以。但当成千上百个ImageView载入成千上百个图像、尤其是当这些图片还是从网络中异步获取,那么须要考虑的问题细节非常多非常繁琐且easy出错。如今随便举例当中几条:

(1)最主要的问题,网络不可靠。可能在不可靠网络载入过程中。图片载入发生难以预估的失败。

(2)已经从网络或本地中载入成功的图片,应该避免反复载入,反复载入造成网络流量浪费。以及设备计算资源的反复浪费。因此须要考虑图片缓存策略。

缓存分为两级缓存:第一级:内存缓存,第二级:“硬盘”缓存(一般是手机的外置存储如SD卡和内置存储)。实现这种层级缓存策略须要自己维护和组织。

内存缓存能够考虑使用Android的LruCache。详情參考我的另外两篇文章:

a、《使用新式LruCache代替SoftReference缓存图片,Android异步载入图片》,文章链接地址:http://blog.csdn.net/zhangphil/article/details/43667415


b、或者自己依照LruCache设计思路实现和管理内存管理,《基于Java LinkedList,实现Android大数据缓存策略》,文章链接地址:http://blog.csdn.net/zhangphil/article/details/44116885


硬盘缓存则要自己建立缓存索引和缓存文件结构(怎样建立缓存文件夹?内存在何时机把硬盘缓存的图片增加等等问题)。

(3)设想这一种情况,在一个Android竖直方向上ListView中有成千上万条图片item,每条item中的图片均需从网络获取。

用户手指在屏幕上高速滑动,滑动过程中,极有可能可见视野内的图片还没有载入完毕后,用户已经高速的往下滑看以下的图片去了。

而上面已经消失的图片载入线程假设置之不理任由其运作,那么,当用户在不断的下拉和上拉过程中,将会造成线程不断的重建和执行,内存开销极大。而对于用户来来,最紧迫的当前可见视野的图片载入显示可能由于线程过多而被无限期迟延到最后显示。

这样的情况一般得应对策略师自己维护和管理一个线程池(关于Java线程池。详情请參考我的另外一篇文章:《Java线程池:ExecutorService。Executors》,文章链接地址:http://blog.csdn.net/zhangphil/article/details/43898637
)。自己管理和维护多线程下载任务队列。显然。须要考虑的线程队列问题非常多,非常繁琐。

等等还有非常多未列举出来的细节问题。

为了避免反复造轮子,这样的情况下最好考虑使用一些业界比較成熟稳定的开源框架。

Android ImageLoader(Android-Universal-Image-Loader),是github上的一个第三方开源图像载入库。该项目在github上的链接地址:

https://github.com/nostra13/Android-Universal-Image-Loader 


Android-Universal-Image-Loader主要应用领域是ImageView载入图片。

该开源框架对上述问题给予了充分的解决。并提供了其它额外的附加功能(如载入的图片尺寸。载入动画等等)。

二、Android-Universal-Image-Loader使用简单介绍。

首先到Android-Universal-Image-Loader官方网址下载项目包。使用能够分为两种方法

(1)把Android-Universal-Image-Loader的所有实现源码(*.java)放入到自己的项目文件夹src下,当作是自己的源码使用。

(2)导入Android-Universal-Image-Loader的jar库文件。比方universal-image-loader-1.9.4.jar。

两种方式都能够。看个人偏好。

我用的是第一种方法。这样能够方便查阅甚至直接二次定制改动Android-Universal-Image-Loader的源码为自己所用。

代码结构层次如图:

然后就能够直接使用,现给出一个演示样例。

測试用的MainActivity.java:

package zhangphil.imageloader;

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.display.FadeInBitmapDisplayer; import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView; public class MainActivity extends ListActivity { private ImageLoader mImageLoader = null; // 载入的图片资源URL
private final String ZHANGPHIL_CSDN_LOGO_URL = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg"; // 载入的数目。假定数据总量非常大
private final int ITEM_COUNT = 10000; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); ListView lv = this.getListView();
ArrayAdapter adapter = new MyArrayAdapter(this, -1);
lv.setAdapter(adapter); mImageLoader = ImageLoader.getInstance();
mImageLoader.init(getImageLoaderConfiguration());
} private ImageLoaderConfiguration getImageLoaderConfiguration() { ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
this)
.threadPoolSize(3)
// 线程数量
.threadPriority(Thread.NORM_PRIORITY)
// 线程优先级
.tasksProcessingOrder(QueueProcessingType.FIFO)
.denyCacheImageMultipleSizesInMemory()
.memoryCacheSize(1024 * 1024 * 10) // 内存缓存的容量10MB
.diskCacheFileCount(100)// 缓存的文件数量
.diskCacheSize(1024 * 1014 * 100)// 硬盘缓存的大小100MB
.writeDebugLogs()// 输出日志
.build(); return config;
} private DisplayImageOptions getDisplayImageOptions() { DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.loading)
// 载入过程中显示的图片
.showImageForEmptyUri(R.drawable.ic_launcher)
// 空URI显示的图片
.showImageOnFail(R.drawable.error)
// 载入失败时候显示内容
.cacheInMemory(true)
// 缓存到内存
.cacheOnDisk(true)
// 缓存到硬盘
.considerExifParams(true)
.displayer(new FadeInBitmapDisplayer(1000))// 淡入载入图片显示
.build(); return options;
} private class MyArrayAdapter extends ArrayAdapter { private LayoutInflater inflater;
private int resId = R.layout.item;
private DisplayImageOptions mDisplayImageOptions; public MyArrayAdapter(Context context, int resource) {
super(context, resource);
inflater = LayoutInflater.from(getContext());
mDisplayImageOptions = getDisplayImageOptions();
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = inflater.inflate(resId, null); ImageView imageView = (ImageView) convertView
.findViewById(R.id.image);
mImageLoader.displayImage(ZHANGPHIL_CSDN_LOGO_URL, imageView,
mDisplayImageOptions); return convertView;
} @Override
public int getCount() {
return ITEM_COUNT;
}
} // private File getMyCacheDir() {
// File sdRoot = Environment.getExternalStorageDirectory();
// String myImageLoaderCacheFileDir = "ImageLodaerCache";
// File cacheFileDir = new File(sdRoot, myImageLoaderCacheFileDir);
// return cacheFileDir;
// }
}

Item.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/image" > </ImageView>

素材error.png和Loading.gif能够依据个人的须要选取不同的图片资源。

ImageLoader在使用之前须要做一些初始化工作。配置ImageLoaderConfiguration和DisplayImageOptions 。

然后就能够直接使用ImageLoader的displayImage()方法从网络或本地存储中异步载入图片资源。而关于图片资源的缓存和异步下载线程池队列则交由ImageLoader为我们妥善在后台管理好。

Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍的更多相关文章

  1. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

  2. 【Android 应用开发】 ActionBar 样式具体解释 -- 样式 主题 简单介绍 Actionbar 的 icon logo 标题 菜单样式改动

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/3926916 ...

  3. Android开发模式之MVC,MVP和MVVM的简单介绍与区别

    相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候 ...

  4. Android中Universal Image Loader开源框架的简单使用

    UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...

  5. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  6. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  7. 开源项目Universal Image Loader for Android 说明文档 (1) 简介

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  8. 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  9. Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

    Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术 ...

随机推荐

  1. Scrum Meeting Alpha - 1 (团队任务分解)

    团队任务分解 Alpha阶段项目目标 实现一个博客园班级博客的Android 客户端: 实现班级博客的常用功能(不包括投票.公告.校区) 有一个较为简洁美观.操作方便的界面 添加消息提醒功能. 任务拆 ...

  2. socket阻塞IO流程图

    单线程 多线程

  3. 用C#实现DES加密解密解决URL参数明文的问题

    啥也不说,直接上代码. 加密解码,封装到一个类,key可以自己修改. using System; using System.Security.Cryptography; using System.Te ...

  4. ios -Unity3D的EasyAR集成到已经有项目中。

    近期 在做AR这一块,用EasyAR集成到iOS端,由于现在到项目已经上线,下一版本要做一个AR功能,于是迫于需求需要,自己研究和翻阅读好多集成到资料. 通过整理分出几个重要到模块,其中在这里指出Xc ...

  5. [转载] kill命令

    转载自http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html Linux中的kill命令用来终止指定的进程(terminate a p ...

  6. select * from 的一些心得

    如何简单运用好 select * from语句,在不同的函数下,有不同的先后顺序. 语法格式 (代表先后顺便) (2)select 字段名 查询什么东西 (1)from 表名,从哪个表查询 例如:查询 ...

  7. 抛弃JQ,回归原生js……

    之前我写过一篇文章叫做<jq不会被淘汰>--而事实上它真的不会被淘汰,因为即使在mvvm框架盛行的今天,原生js的api越来越友好的今天,jq依然在用户量上是霸主-- 但是今天我们要讨论的 ...

  8. ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?

    在上一章中,详细介绍了 ASP.NET Core 中的授权策略,在需要授权时,只需要在对应的Controler或者Action上面打上[Authorize]特性,并指定要执行的策略名称即可,但是,授权 ...

  9. Gotorch - 多机定时任务管理系统

    * { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...

  10. Function Programming - 纯函数(Pure Function)

    纯函数的定义,非常重要!! Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用. 老样子,我们还是从最简单的栗子开始: var minimum = 21; va ...