Android-Universal-Image-Loader使用实例

本文详细介绍了Android-Universal-Image-Loader的使用方法,包括配置步骤、流程图、使用步骤等核心内容。通过配置XML、初始化类及在Activity中的实现,实现了异步图像加载、缓存和显示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示,该库的特点如下:

       1、多线程图片加载
       2、尽可能多的配置选项(线程池,加载器,解析器,内存/磁盘缓存,显示参数等等)
       3、图片可以缓存在内存中,或者设备文件目录下,或者SD卡中
       4、可以监听加载进度
       5、可以自定义显示每一张图片时都带不同参数
       6、支持Widget

二、流程图

      借鉴一下别人的图大笑


三、使用步骤

       1、配置AndroidManifest.xml

    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

        2、Application中初始化类ImageLoaderConfiguration

      ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
        .diskCacheExtraOptions(480, 800, null)
        .taskExecutor(...)
        .taskExecutorForCachedImages(...)
        .threadPoolSize(3) //设置线程池的大小,池的大小决定能同时运行的线程数
        .threadPriority(Thread.NORM_PRIORITY - 1)//设置正在运行任务的所有线程在系统中的优先级
        .tasksProcessingOrder(QueueProcessingType.FIFO) 
        .denyCacheImageMultipleSizesInMemory()//强制UIL在内存中不能存储内容相同但大小不同的图像
        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))//指定内存缓存的实现
        .memoryCacheSize(2 * 1024 * 1024)//设置内存缓存的最大占用空间
        .memoryCacheSizePercentage(13) 
        .diskCache(new UnlimitedDiscCache(cacheDir))//定义自己的磁盘缓存
        .diskCacheSize(50 * 1024 * 1024)
        .diskCacheFileCount(100)
        .diskCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5加密  
        .imageDownloader(new BaseImageDownloader(context)) 
        .imageDecoder(new BaseImageDecoder())
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
        .writeDebugLogs()
        .build();

        ImageLoader.getInstance().init(config);
       3、在Activity中实现

public class ListViewActivity extends Activity{
	private MyListView myListview = null;
//	private List<Map<String, Object>> mList=new ArrayList<Map<String,Object>>();

	private DisplayImageOptions options;
	String[] mImageUrls = Constants.IMAGES;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		options = new DisplayImageOptions.Builder()
		.showImageOnLoading(R.drawable.ic_stub)
		.showImageForEmptyUri(R.drawable.ic_empty)
		.showImageOnFail(R.drawable.ic_error)
		.cacheInMemory(true)
		.cacheOnDisk(true)
		.considerExifParams(true)
		.displayer(new RoundedBitmapDisplayer(20))
		.build();
		
		setContentView(R.layout.listview_main);
		myListview = (MyListView)findViewById(R.id.listview);
		MyAdapter adapter = new MyAdapter(this);

		myListview.setAdapter(adapter);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		AnimateFirstDisplayListener.displayedImages.clear();
	}
	
	public class MyAdapter extends BaseAdapter{
		private LayoutInflater mInflater;
		private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

		public MyAdapter(Context context) {
			mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mImageUrls.length;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			ViewHolder hold = null;
			
			if(convertView == null){
				hold = new ViewHolder();
				convertView = mInflater.inflate(R.layout.list_item, null);
				hold.item_image = (ImageView)convertView.findViewById(R.id.list_image);
				hold.item_title = (TextView)convertView.findViewById(R.id.list_title);
				hold.item_content = (TextView)convertView.findViewById(R.id.list_content);
				convertView.setTag(hold);
			}else{
				hold = (ViewHolder)convertView.getTag();
			}
			//mImageUrls[position]是图片的url,hold.item_image是控件
                        /*除了使用网络图片,还可以使用本地图片url如下:
                         *  String imageUri = "http://site.com/image.png"; // from Web 
                         *  String imageUri = "file:///mnt/sdcard/image.png"; // from SD card 
                         *  String imageUri = "content://media/external/audio/albumart/13"; // from content provider 
                         *  String imageUri = "assets://image.png"; // from assets 
                         *  String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)  
                         */
                        ImageLoader.getInstance().displayImage(mImageUrls[position], hold.item_image, options, animateFirstListener);
			hold.item_title.setText("title " + (position + 1));
			hold.item_content.setText("content " + (position + 1));
			return convertView;
		}
		
		public final class ViewHolder {
			public TextView item_title;
			public TextView item_content;
			public ImageView item_image;
		}
	}
	
	private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

		static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

		@Override
		public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
			if (loadedImage != null) {
				ImageView imageView = (ImageView) view;
				boolean firstDisplay = !displayedImages.contains(imageUri);
				if (firstDisplay) {
					FadeInBitmapDisplayer.animate(imageView, 500);
					displayedImages.add(imageUri);
				}
			}
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值