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

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. Autodesk的照片建模云服务—Autodesk ReCap 360 photo 的测试数据

    之前已经给大家介绍过了Autodesk的照片建模云服务—Autodesk ReCap 360 photo, 你也可以自己登录到http://recap360.autodesk.com/ 自己试一试. ...

  2. Day Tips:ForceDeleteSite

    最近遇到一个奇怪的问题,如下图:     试了各种删除方式都不行.     谷歌了一下发现需要使用如下代码删除.     SPWebApplication w = SPWebApplication.L ...

  3. Understanding theory (1)

    Source: verysmartbrothas.com It has been confusing since my first day as a PhD student about theory ...

  4. The specified file or folder name is too long

    You receive a "The specified file or folder name is too long" error message when you creat ...

  5. APP One Link ,android and ios qrcode merge as One QRCode and one short link

    Adroid and ios qrcode merge as One QRCode and one short link is publish , the web site is www.appone ...

  6. Android studio 如何查看当前git 分支的4种方式

    1.第一种       2.第二种       3.第三种 4.第四种       前面3种都是通过android studio 操作的. 第四种是通过命令行操作.(可以在 git bash 中输入命 ...

  7. (视频)《快速创建网站》 4.1 为啥造软件不同于造汽车,为啥是软件就一定会有Bug - 构建开发运维一体化(DevOps)

    本文是<快速创建网站>系列的第9篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  8. TY创新D总个人经历谈

    这是深圳一个公司的老板(就叫D总吧)在吃饭间和我们讲起的他的个人经历,这中间个人的苦辣酸甜,有些意思,值得玩味,就做了个实录. D总:我当时做餐饮是在我第一次创业失败之后.我做的是一家火锅店. 这家餐 ...

  9. Zero to One读后感

    Zero to One是一本不错的书,无论你是在职场还是在创业都应该看看先.书中没有告诉你任何的职业技巧,但是很明确的告诉了你应该有的思考方式,告诉你人与机器的关系,告诉成功企业固有的模式以及你为什么 ...

  10. java.lang.OutOfMemoryError处理错误

    内存详解 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多 ...