• 使用UIL(Universal-Image-Loader)异步加载图片


    概要 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;
    	}
    

      效果图如下:

      

     
  • 相关阅读:
    记第一场cf比赛(Codeforces915)
    Uva11468:Substring
    Uva11732:"strcmp()" Anyone?
    Uva1014:Remember the Word
    洛谷P2502:[HAOI2006]旅行
    bzoj3677: [Apio2014]连珠线
    bzoj4906: [BeiJing2017]喷式水战改
    海上孤独的帆
    Treap基本用法总结
    noip2017考前基础复习——数论数学
  • 原文地址:https://www.cnblogs.com/wjtaigwh/p/4931573.html
Copyright © 2020-2023  润新知