android中使用universalimageloader异步加载图片

来源:赵克立博客 分类: Android 标签:Android发布时间:2015-07-16 11:48:56最后更新:2015-07-16 12:13:58浏览:3748
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2015-07-16 12:13:58
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

universalimageloader是个开源项目可以在github上取得universalimageloader

先看下这个库的功能

  1. 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等

  2. 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置

  3. 支持图片的内存缓存,文件系统缓存或者SD卡缓存

  4. 支持图片下载过程的监听

  5. 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存

  6. 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片

  7. 提供在较慢的网络下对图片进行加载

下面是使用方法

首先添加相应权限

配置Android Manifest文件

<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Include next permission if you want to allow UIL to cache images on SD card -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
    <application android:name="MyApplication">
        ...
    </application>
</manifest>

下面是对universalimageloader的全局初始化(只用一次就可以啦)

package com.demo.core;

import java.io.File;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
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.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import android.app.Application;
import android.content.Context;

public class MYApplication extends Application {
	@Override
	public void onCreate() {
		super.onCreate();
		initImageLoader(getApplicationContext());
	}

	public static void initImageLoader(Context context) {
    	File cacheDir = StorageUtils.getCacheDirectory(context);
    	ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
    	        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
    	        .diskCacheExtraOptions(480, 800, null)
    	        .taskExecutor(null)
    	        .taskExecutorForCachedImages(null)
    	        .threadPoolSize(3) // default
    	        .threadPriority(Thread.NORM_PRIORITY - 2) // default
    	        .tasksProcessingOrder(QueueProcessingType.FIFO) // default
    	        .denyCacheImageMultipleSizesInMemory()
    	        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
    	        .memoryCacheSize(2 * 1024 * 1024)
    	        .memoryCacheSizePercentage(13) // default
    	        .diskCache(new UnlimitedDiskCache(cacheDir)) // default
    	        .diskCacheSize(50 * 1024 * 1024)
    	        .diskCacheFileCount(100)
    	        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
    	        .imageDownloader(new BaseImageDownloader(context)) // default
    	        .imageDecoder(new BaseImageDecoder(false)) // default
    	        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
    	        .writeDebugLogs()
    	        .build();
    	ImageLoader.getInstance().init(config);//全局初始化此配置  
	}
}

写一个自己的MYApplication类,再设置为app默认启动的类

  <application
        android:allowBackup="true"
        android:icon="@drawable/icon3"
        android:label="@string/app_name"
        android:name="com.demo.core.MYApplication"<!-- 启动时的类名 -->
        android:theme="@android:style/Theme.NoTitleBar">
  </application>

准备工作已经完成下面就是使用啦

第一种方法

	    	//返回一个实例
	    	ImageLoader imageLoader = ImageLoader.getInstance();
	    	//显示图片参数分别是图片的url地址   和imageview控件对象
	    	imageLoader.displayImage(urlStr,image);

第二种方法使用一些自己的配置如下

   	DisplayImageOptions options = new DisplayImageOptions.Builder()
	    	        //.showImageOnLoading(R.drawable.default_ico) // 设置图片在下载期间显示的图片
	    	        //.showImageForEmptyUri(R.drawable.default_ico)// 设置图片Uri为空或是错误的时候显示的图片  
	    	       // .showImageOnFail(R.drawable.default_ico)// 设置图片加载/解码过程中错误时候显示的图片  
	    	        .resetViewBeforeLoading(true)  // default
	    	        .delayBeforeLoading(1000)
	    	        .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
	    	        .cacheOnDisk(true)  //设置下载的图片是否缓存在SD卡中  
	    	       // .postProcessor(null)//在图片显示之前的操作
	    	        //.preProcessor(null) //设置图片加入缓存前,对bitmap进行设置   
	    	        .extraForDownloader(null)
	    	        .considerExifParams(false) // default
	    	        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
	    	        .bitmapConfig(Bitmap.Config.ARGB_8888) // default
	    	      //  .decodingOptions(null)
	    	        .displayer(new SimpleBitmapDisplayer()) // default
	    	        .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少  
	    	        .displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间  
	    	        .handler(new Handler()) // default
	    	        .build();

然后再显示图片使用方法如下

   	imageLoader.displayImage(urlStr, image, options, new SimpleImageLoadingListener() {
	    	    @Override
	    	    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
	    	        // Do whatever you want with Bitmap
	    	    	Log.v("catch",view+"");
	    	    	try{
	                if (loadedImage != null && view!=null) {  
	                    ImageView imageView = (ImageView) view;  
	                   // imageView.setImageBitmap(loadedImage);
	                    // 是否第一次显示  
	                    boolean firstDisplay = !displayedImages.contains(imageUri);  
	                    if (firstDisplay) {  
	                        // 图片淡入效果  
	                        FadeInBitmapDisplayer.animate(imageView, 800);  
	                        displayedImages.add(imageUri);  
	                    } 
	                } 
	    	    	}catch(Exception e){
	    	    		Log.v("catch1",e.getMessage());
	    	    	}
	    	    }
	    	});

注意上面有一个图片淡入效果如果要使用的话要添加下面代码

	把下面代码添加到你的适配器成员变量里,或是你的当前使用的类里面
	static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

ok啦结束,下面是使用的库直接放入libs中就可以

universalimageloader-1.9.4.rar



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python