android图片缓存框架Android-Universal-Image-Loader(二)

这篇打算直接告诉大家怎么用吧,其实这个也不是很难的框架,大致使用过程如下:

	// 获取缓存图片目录
		File cacheDir = StorageUtils.getOwnCacheDirectory(activity,
				"imageloader/Cache");

		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
				activity).memoryCacheExtraOptions(800, 760)
				// 保存每个缓存图片的最大长和宽
				.threadPoolSize(3)
				.diskCache(new UnlimitedDiscCache(cacheDir))
				// 线程池的大小 这个其实默认就是3
				.memoryCacheSize(2 * 1024)
				// 设置缓存的最大字节
				.denyCacheImageMultipleSizesInMemory()
				// 缓存显示不同大小的同一张图片
				.imageDownloader(
						new BaseImageDownloader(activity, 5 * 1000, 30 * 1000)) // connectTimeout
				// s)超时时间
				.build();
		imageLoader.init(config);

上面设置的目录在我手机的/storage/sdcard0/imageloader/Cache中文件是没有.jpg或者.png结尾的,是一堆无格式的文件,可以通过扩展名导出打开

第二步设置显示图片选项:

</pre><p></p><p><pre name="code" class="java">DisplayImageOptionsoptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)//设置图片在下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_launcher)//设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true)//设置下载的图片是否缓存在内存中
.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
.displayer(new FadeInBitmapDisplayer(100))
.considerExifParams(true)
.displayer(new FadeInBitmapDisplayer(100))// 图片加载好后渐入的动画时间
.displayer(new RoundedBitmapDisplayer(1)).build();//这个一定要设置,不设置的话会导致图片不能够铺满整个控件,这个是设置圆角效果的,如果大家不喜欢圆角可以设置为1几乎没有什么效果

通过上面的代码就可以正常使用了

下面是官方给的一个列子,会android看看下面的这个代码应该就知道怎么使用了吧,非常简单

public class ImageListActivity extends AbsListViewBaseActivity {

	DisplayImageOptions options;

	String[] imageUrls;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ac_image_list);

		Bundle bundle = getIntent().getExtras();
		imageUrls = bundle.getStringArray(Extra.IMAGES);

		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();

		listView = (ListView) findViewById(android.R.id.list);
		((ListView) listView).setAdapter(new ItemAdapter());
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				startImagePagerActivity(position);
			}
		});
	}
//注意下这里,当按下返回键的时候清除一下在内存中的图片,大家不过要过度依赖自动内存管理,有些时候还是手动去清除掉内存比较好,
	@Override
	public void onBackPressed() {
		AnimateFirstDisplayListener.displayedImages.clear();
		super.onBackPressed();
	}

	private void startImagePagerActivity(int position) {
		Intent intent = new Intent(this, ImagePagerActivity.class);
		intent.putExtra(Extra.IMAGES, imageUrls);
		intent.putExtra(Extra.IMAGE_POSITION, position);
		startActivity(intent);
	}

	private static class ViewHolder {
		TextView text;
		ImageView image;
	}

	class ItemAdapter extends BaseAdapter {

		private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

		@Override
		public int getCount() {
			return imageUrls.length;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			View view = convertView;
			final ViewHolder holder;
			if (convertView == null) {
				view = getLayoutInflater().inflate(R.layout.item_list_image, parent, false);
				holder = new ViewHolder();
				holder.text = (TextView) view.findViewById(R.id.text);
				holder.image = (ImageView) view.findViewById(R.id.image);
				view.setTag(holder);
			} else {
				holder = (ViewHolder) view.getTag();
			}

			holder.text.setText("Item " + (position + 1));

			imageLoader.displayImage(imageUrls[position], holder.image, options, animateFirstListener);

			return view;
		}
	}

	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);
				}
			}
		}
	}
}

这是一个demo,这个图片选项最好配置成一个单列类,便于管理和减少内存的溢出。

android图片缓存框架Android-Universal-Image-Loader(二)

时间: 2024-10-24 13:34:19

android图片缓存框架Android-Universal-Image-Loader(二)的相关文章

android图片缓存框架Android-Universal-Image-Loader

最近跟同学们做了一个创业项目,其实跟以前做项目不同,以前大多数都是做web网站,对内存管理这些不太关注,因为是pc机,做android的话也就是一些小列子,现在到了做产品阶段吧,只能把项目做到最优.不扯了,先来说这个框架是做什么的,Android-Universal-Image-Loader主要是一个图片的缓存框架,根据官方解释就是,它提供了一个异步处理图片的方案.它提供两种获取图片方式async or sync,并且提供了一个可定制化的组件(thread executors, download

图片会说话系列之Android图片缓存框架

前言:看过很多精彩的文章,作者写的非常好,但总觉得文字描述没有图片或图表说明来得直观,因为图片可以化抽象为具体.语言是有区域性的,而图片则是全世界通用的,即使语言不通,却能通过图片了解一切.因此想做一个系列的简博客,内容就是一张图附带一些必要的说明,这样就能迅速抓住重点,而不需要做太多的阅读,便能了解框架性的东西.文章所涉及到的图片有的可能来自官方网站,有的来自名家博客,或者是自己绘制的,都会一一说明. 切入正题,先来第一发,上图: 上图来自:https://github.com/nostra1

Android图片缓存技术!直接用在你的项目中,简单方便高效

好久没有写博客了,最近比较繁琐,什么面试呀,找工作呀,大三的生活就快完了,准确的是大学的生活就快完了!三年了,一直在搞移动开发,感觉好快呀,不想就这样的离开学校了!咳咳咳,扯远了... 前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imageview无法加载,可能是存在以下问题吧,况且导入框架导致开发的项目包越来越大,基于上面的这几种情况,于是我就想自

Android-UIL图片缓存框架 源码解析

Android-Universal-Image-Loader 是 github上一个开源的图片缓存框架 ,提供图片MemoryCache和DiskCache的功能,并支持加载网络.本地.contentProvider图片的功能 Acceptable URIs examples "http://site.com/image.png" // from Web "file:///mnt/sdcard/image.png" // from SD card "fil

Universal-Image-Loader(android图片缓存)

转载请注明http://write.blog.csdn.net/postedit?ref=toolbar 点击下载所需jar文件 具体资料整理请加群284568173自行下载pdf 项目介绍: Android上最让人头疼的莫过于从网络获取图片.显示.回收,不论什么一个环节有问题都可能直接OOM.这个项目也许能帮到你.Universal Image Loader for Android的目的是为了实现异步的网络图片载入.缓存及显示,支持多线程异步载入.它最初来源于Fedor Vlasov的项目.且

【转】Universal-Image-Loader(android图片缓存)

原文http://write.blog.csdn.net/postedit?ref=toolbar 项目介绍: Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的是为了实现异步的网络图片加载.缓存及显示,支持多线程异步加载.它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进. 特性列举: 多线程下载图片,图片可以来源于网络,文

Android图片缓存库使用经验总结

Volley,Universal-Image-Loader和picasso 几个图片加载请求 框架的分析 http://www.wl566.com/biancheng/154046.html http://blog.csdn.net/djun100/article/details/24708825 主要是 在 ListView 滑动的时候,取消已经消失的,省下资源. Picasso 和 Universal-Image-Loader 都做了. volley 取消 好像要我们自己去取消, cancl

android图片缓存(包含ReusableBitmapDrawable和BitmapPool)

现在做的项目中,有用到一个开源的2D地图框架osmdroid,但是在项目中,使用还是有一些问题,例如,多个地图实例,会有独自的图片缓存,Activity onPause时,并不会释放图片缓存,如果多级界面都有地图的话,可能会造成很多手机内存溢出(按照每个瓦片256*256,屏幕1280*720来算,显示一个屏幕的地图,至少要在内存保存15张图片,占用内存256*256*4*15=3.75M),所以还是得针对项目做一定的修改调整.今天将项目中使用到的图片缓存做一个整理. 首先说下整体的图片加载流程

Android 图片裁切框架 uCrop 的用法

1 uCrop简介 最近项目中用到了图片裁剪功能,于是百度了一下,发现了uCrop这个框架,这个框架的星星数很多,就决定使用这个框架 uCrop的Github地址:https://github.com/Yalantis/uCrop uCrop的特点: 裁剪框不动,图片动 图片可以旋转,缩放 支持各种比例裁剪框 uCrop的效果图(来自其Github): 2 集成uCrop (1) uCrop集成方法: compile 'com.yalantis:ucrop:1.4.1' (2) 修改当前项目的b