版权声明:本文为博主原创文章,未经博主允许不得转载。

Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架。这个框架已经被很多开发者所使用,是最常用的几个 Android开源项目之一,主流的应用,随便反编译几个,都可以见到它的身影。淘宝,天猫,Facebook,京东商城等都用到了这个项目。
该项目的Github地址链接:https://github.com/nostra13/Android-Universal-Image-Loader

运行流程:
每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,它会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从网络中获取。

使用步骤:
1、加载图片之前,先要做初始化配置,这个类似很多游戏引擎使用前要做一下初始化,其实只做了一件事,实例化一个全局的ImageLoader对象,同时
传入图片加载缓存的配置,ImageLoaderConfiguration封装了基本的配置信息,比如加载图片事用的线程池大小,线程的优先级,内存缓
存大小,是否支持同一图片的多尺寸缓存(默认是支持的,可以手动关闭),还有缓存的命名规则等等。

2、配置完后,就可以开始使用了,通过ImageLoader的displayImage()绑定一个图片和ImageView。
displayImage(String uri, ImageView imageView, DisplayImageOptions options)
DisplayImageOptions用于指导每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。

实例:UniversalImageLoaderDemo

运行效果:

代码清单:
AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.rainsong.universalimageloaderdemo"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="19" />
  9. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  10. <uses-permission android:name="android.permission.INTERNET" />
  11. <application
  12. android:name="com.rainsong.universalimageloaderdemo.UILApplication"
  13. android:allowBackup="true"
  14. android:icon="@drawable/logo"
  15. android:label="@string/app_name"
  16. android:theme="@style/AppTheme" >
  17. <activity
  18. android:name="com.rainsong.universalimageloaderdemo.MainActivity"
  19. android:label="@string/app_name" >
  20. <intent-filter>
  21. <action android:name="android.intent.action.MAIN" />
  22. <category android:name="android.intent.category.LAUNCHER" />
  23. </intent-filter>
  24. </activity>
  25. </application>
  26. </manifest>

布局文件:activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".MainActivity" >
  8. <ListView
  9. android:id="@+id/list"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent" >
  12. </ListView>
  13. </LinearLayout>

布局文件:item_list.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content" >
  5. <ImageView
  6. android:id="@+id/image"
  7. android:layout_width="72dip"
  8. android:layout_height="72dip"
  9. android:layout_margin="3dip"
  10. android:adjustViewBounds="true"
  11. android:contentDescription="@string/descr_image"
  12. android:scaleType="centerCrop" />
  13. <TextView
  14. android:id="@+id/text"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:layout_gravity="start|center_vertical"
  18. android:layout_marginLeft="20dip"
  19. android:textSize="22sp" />
  20. </LinearLayout>

Java源代码文件:UILApplication.java

  1. package com.rainsong.universalimageloaderdemo;
  2. import java.io.File;
  3. import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
  4. import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
  5. import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
  6. import com.nostra13.universalimageloader.core.ImageLoader;
  7. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
  8. import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
  9. import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
  10. import com.nostra13.universalimageloader.utils.StorageUtils;
  11. import android.app.Application;
  12. import android.content.Context;
  13. public class UILApplication extends Application {
  14. @Override
  15. public void onCreate() {
  16. super.onCreate();
  17. initImageLoader(getApplicationContext());
  18. }
  19. public static void initImageLoader(Context context) {
  20. //缓存文件的目录
  21. File cacheDir = StorageUtils.getOwnCacheDirectory(context, "universalimageloader/Cache");
  22. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
  23. .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽
  24. .threadPoolSize(3) //线程池内线程的数量
  25. .threadPriority(Thread.NORM_PRIORITY - 2)
  26. .denyCacheImageMultipleSizesInMemory()
  27. .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密
  28. .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
  29. .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
  30. .diskCacheSize(50 * 1024 * 1024)  // SD卡缓存的最大值
  31. .tasksProcessingOrder(QueueProcessingType.LIFO)
  32. // 由原先的discCache -> diskCache
  33. .diskCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径
  34. .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
  35. .writeDebugLogs() // Remove for release app
  36. .build();
  37. //全局初始化此配置
  38. ImageLoader.getInstance().init(config);
  39. }
  40. }

Java源代码文件:MainActivity.java

    1. package com.rainsong.universalimageloaderdemo;
    2. import com.nostra13.universalimageloader.core.DisplayImageOptions;
    3. import com.nostra13.universalimageloader.core.ImageLoader;
    4. import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
    5. import android.os.Bundle;
    6. import android.app.Activity;
    7. import android.view.Menu;
    8. import android.view.MenuItem;
    9. import android.view.View;
    10. import android.view.ViewGroup;
    11. import android.widget.BaseAdapter;
    12. import android.widget.ImageView;
    13. import android.widget.ListView;
    14. import android.widget.TextView;
    15. public class MainActivity extends Activity {
    16. private ImageLoader imageLoader;
    17. private ListView lv;
    18. private String[] imageUrls;
    19. private DisplayImageOptions options;
    20. @Override
    21. protected void onCreate(Bundle savedInstanceState) {
    22. super.onCreate(savedInstanceState);
    23. setContentView(R.layout.activity_main);
    24. imageLoader = ImageLoader.getInstance();
    25. lv = (ListView)findViewById(R.id.list);
    26. imageUrls = Constants.images;
    27. // 使用DisplayImageOptions.Builder()创建DisplayImageOptions
    28. options = new DisplayImageOptions.Builder()
    29. .showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片
    30. .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片
    31. .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片
    32. .cacheInMemory(true) // 设置下载的图片是否缓存在内存中
    33. .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
    34. .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
    35. .build(); // 构建完成
    36. lv.setAdapter(new ItemListAdapter());
    37. }
    38. @Override
    39. public boolean onCreateOptionsMenu(Menu menu) {
    40. // Inflate the menu; this adds items to the action bar if it is present.
    41. getMenuInflater().inflate(R.menu.main, menu);
    42. return true;
    43. }
    44. @Override
    45. public boolean onOptionsItemSelected(MenuItem item) {
    46. switch (item.getItemId()) {
    47. case R.id.item_clear_memory_cache:
    48. ImageLoader.getInstance().clearMemoryCache();
    49. return true;
    50. case R.id.item_clear_disc_cache:
    51. ImageLoader.getInstance().clearDiskCache();
    52. return true;
    53. default:
    54. return false;
    55. }
    56. }
    57. class ItemListAdapter extends BaseAdapter {
    58. @Override
    59. public int getCount() {
    60. // TODO Auto-generated method stub
    61. return imageUrls.length;
    62. }
    63. @Override
    64. public Object getItem(int position) {
    65. // TODO Auto-generated method stub
    66. return imageUrls[position];
    67. }
    68. @Override
    69. public View getView(int position, View convertView, ViewGroup parent) {
    70. // TODO Auto-generated method stub
    71. ViewHolder holder = null;
    72. if (convertView == null) {
    73. convertView = getLayoutInflater().inflate(R.layout.item_list, parent, false);
    74. holder = new ViewHolder();
    75. holder.text = (TextView) convertView.findViewById(R.id.text);
    76. holder.image = (ImageView) convertView.findViewById(R.id.image);
    77. convertView.setTag(holder);
    78. } else {
    79. holder = (ViewHolder) convertView.getTag();
    80. }
    81. holder.text.setText("Item " + (position + 1));
    82. imageLoader.displayImage(imageUrls[position], holder.image, options);
    83. return convertView;
    84. }
    85. @Override
    86. public long getItemId(int position) {
    87. // TODO Auto-generated method stub
    88. return position;
    89. }
    90. class ViewHolder {
    91. public ImageView image;
    92. public TextView text;
    93. }
    94. }
    95. http://blog.csdn.net/hantangsongming/article/details/41961749

Android图片异步加载框架Android-Universal-Image-Loader的更多相关文章

  1. Android 图片异步加载的体会,SoftReference已经不再适用

      在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>>  这样软引用的 ...

  2. Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  3. Android图片异步加载之Android-Universal-Image-Loader(转)

    今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...

  4. [置顶] Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  5. Android图片异步加载

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

  6. Android图片异步加载的方法

    很多时候,我们在加载大图片或者需要处理较多图像数据的时候,希望显示效果能好点,不至于因为图片解码耗时产生ANR等情况,不得不说异步加载是个不错的方法.说到异步加载,避免application出现ANR ...

  7. Android 图片异步加载 加载网络图片

    最近用到了加载网络图片,研究了一下,写一点简单的介绍: 首先创建一个线程去取图片(网络请求必须放在线程中): /** * 使用继承java.lang.Thread类的方式创建一个线程 * 直接取图片, ...

  8. android 异步加载框架 原理完全解析

    一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...

  9. Android ListView 图片异步加载和图片内存缓存

    开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...

随机推荐

  1. Emacs学习心得之 基础配置

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...

  2. Java File类总结和FileUtils类

    Java File类总结和FileUtils类 文件存在和类型判断 创建出File类的对象并不代表该路径下有此文件或目录. 用public boolean exists()可以判断文件是否存在. Fi ...

  3. git 上的pull request 是什么意思?

    1.git 上有常见的pull request 功能 2.pull request 的含义 解释一:    有一个仓库,叫Repo A.你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Gi ...

  4. swift 2.2 语法 (中)

    前言: 1.此文中的语法会根据Swift的升级变动而更新. 2.如果需要请移步 -> swift2.2 语法(上).swift 2.2语法(下) 函数 和C语言一样,swift也有函数,性质和我 ...

  5. 【代码笔记】iOS-带输入框的UIAlertView

    一,效果图. 二,代码. //点击任何处,弹出输入框 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UIAlertV ...

  6. 基于ruby的watir自动化测试 笔记一

    基于Ruby的watir-webdriver自动化测试方案与实施(五)   基于Ruby的watir-webdriver自动化测试方案与实施(四)   基于Ruby的watir-webdriver自动 ...

  7. 【转】JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  8. mac 远程连接服务器

    很多刚用mac的同学 可能会纠结,连接远程服务器咋整? 有没有类型windows上的securecrt 其实,完全可以不用: mac自带的终端就可以搞定:终端terminal 如何连接远程服务器? s ...

  9. Java调用webservice接口方法

                             java调用webservice接口   webservice的 发布一般都是使用WSDL(web service descriptive langu ...

  10. dotNet使用HttpWebRequest模拟浏览器

    在编写网络爬虫时,HttpWebRequest几乎可以完成绝大多数网站的抓取,为了更好的使用这一技术,我将常用的几个功能进行了封装,以方便调用.这个类已经在多个项目中得到使用,主要解决了Cookies ...