开源项目之UniversalImageLoader(异步加载大量图片)

UniversalImageLoader是实现异步加载大量图片的源码和例子,包括缓存、硬盘缓存、容错机制等技术。

项目如图:

测试效果如图:


总共有四种格式效果!

第一种ImageList,效果如图:


关键测试代码如下:

  1. public class ImageListActivity extends BaseActivity
  2. {
  3. private String[] imageUrls;
  4. private DisplayImageOptions options;
  5. @Override
  6. public void onCreate(Bundle savedInstanceState)
  7. {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.ac_image_list);
  10. Bundle bundle = getIntent().getExtras();
  11. imageUrls = bundle.getStringArray(Extra.IMAGES);
  12. options = new DisplayImageOptions.Builder()
  13. .showStubImage(R.drawable.stub_image).cacheInMemory()
  14. .cacheOnDisc().build();
  15. ListView listView = (ListView) findViewById(android.R.id.list);
  16. listView.setAdapter(new ItemAdapter());
  17. listView.setOnItemClickListener(new OnItemClickListener()
  18. {
  19. @Override
  20. public void onItemClick(AdapterView<?> parent, View view,
  21. int position, long id)
  22. {
  23. startImageGalleryActivity(position);
  24. }
  25. });
  26. }
  27. @Override
  28. protected void onStop()
  29. {
  30. imageLoader.stop();
  31. super.onStop();
  32. }
  33. private void startImageGalleryActivity(int position)
  34. {
  35. Intent intent = new Intent(this, ImagePagerActivity.class);
  36. intent.putExtra(Extra.IMAGES, imageUrls);
  37. intent.putExtra(Extra.IMAGE_POSITION, position);
  38. startActivity(intent);
  39. }
  40. class ItemAdapter extends BaseAdapter
  41. {
  42. private class ViewHolder
  43. {
  44. public TextView text;
  45. public ImageView image;
  46. }
  47. @Override
  48. public int getCount()
  49. {
  50. return imageUrls.length;
  51. }
  52. @Override
  53. public Object getItem(int position)
  54. {
  55. return position;
  56. }
  57. @Override
  58. public long getItemId(int position)
  59. {
  60. return position;
  61. }
  62. @Override
  63. public View getView(final int position, View convertView,
  64. ViewGroup parent)
  65. {
  66. View view = convertView;
  67. final ViewHolder holder;
  68. if (convertView == null)
  69. {
  70. view = getLayoutInflater().inflate(R.layout.item_list_image,
  71. null);
  72. holder = new ViewHolder();
  73. holder.text = (TextView) view.findViewById(R.id.text);
  74. holder.image = (ImageView) view.findViewById(R.id.image);
  75. view.setTag(holder);
  76. } else
  77. holder = (ViewHolder) view.getTag();
  78. holder.text.setText("Item " + position);
  79. imageLoader
  80. .displayImage(imageUrls[position], holder.image, options);
  81. return view;
  82. }
  83. }
  84. }
public class ImageListActivity extends BaseActivity
{

	private String[] imageUrls;

	private DisplayImageOptions options;

	@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()
				.showStubImage(R.drawable.stub_image).cacheInMemory()
				.cacheOnDisc().build();

		ListView listView = (ListView) findViewById(android.R.id.list);
		listView.setAdapter(new ItemAdapter());
		listView.setOnItemClickListener(new OnItemClickListener()
		{
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id)
			{
				startImageGalleryActivity(position);
			}
		});
	}

	@Override
	protected void onStop()
	{
		imageLoader.stop();
		super.onStop();
	}

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

	class ItemAdapter extends BaseAdapter
	{

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

		@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,
						null);
				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);

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

			return view;
		}
	}
}

第二种ImageGrid效果!如图:


测试关键代码如下:

  1. public class ImageGridActivity extends BaseActivity
  2. {
  3. private String[] imageUrls;
  4. private DisplayImageOptions options;
  5. @Override
  6. public void onCreate(Bundle savedInstanceState)
  7. {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.ac_image_grid);
  10. Bundle bundle = getIntent().getExtras();
  11. imageUrls = bundle.getStringArray(Extra.IMAGES);
  12. options = new DisplayImageOptions.Builder()
  13. .showStubImage(R.drawable.stub_image)
  14. .showImageForEmptyUri(R.drawable.image_for_empty_url)
  15. .cacheInMemory().cacheOnDisc().build();
  16. GridView gridView = (GridView) findViewById(R.id.gridview);
  17. gridView.setAdapter(new ImageAdapter());
  18. gridView.setOnItemClickListener(new OnItemClickListener()
  19. {
  20. @Override
  21. public void onItemClick(AdapterView<?> parent, View view,
  22. int position, long id)
  23. {
  24. startImageGalleryActivity(position);
  25. }
  26. });
  27. }
  28. @Override
  29. protected void onStop()
  30. {
  31. imageLoader.stop();
  32. super.onStop();
  33. }
  34. private void startImageGalleryActivity(int position)
  35. {
  36. Intent intent = new Intent(this, ImagePagerActivity.class);
  37. intent.putExtra(Extra.IMAGES, imageUrls);
  38. intent.putExtra(Extra.IMAGE_POSITION, position);
  39. startActivity(intent);
  40. }
  41. public class ImageAdapter extends BaseAdapter
  42. {
  43. @Override
  44. public int getCount()
  45. {
  46. return imageUrls.length;
  47. }
  48. @Override
  49. public Object getItem(int position)
  50. {
  51. return null;
  52. }
  53. @Override
  54. public long getItemId(int position)
  55. {
  56. return position;
  57. }
  58. @Override
  59. public View getView(int position, View convertView, ViewGroup parent)
  60. {
  61. final ImageView imageView;
  62. if (convertView == null)
  63. {
  64. imageView = (ImageView) getLayoutInflater().inflate(
  65. R.layout.item_grid_image, parent, false);
  66. } else
  67. {
  68. imageView = (ImageView) convertView;
  69. }
  70. imageLoader.displayImage(imageUrls[position], imageView, options,
  71. new SimpleImageLoadingListener()
  72. {
  73. @Override
  74. public void onLoadingComplete()
  75. {
  76. Animation anim = AnimationUtils.loadAnimation(
  77. ImageGridActivity.this, R.anim.fade_in);
  78. imageView.setAnimation(anim);
  79. anim.start();
  80. }
  81. });
  82. return imageView;
  83. }
  84. }
  85. }
public class ImageGridActivity extends BaseActivity
{

	private String[] imageUrls;

	private DisplayImageOptions options;

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

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

		options = new DisplayImageOptions.Builder()
				.showStubImage(R.drawable.stub_image)
				.showImageForEmptyUri(R.drawable.image_for_empty_url)
				.cacheInMemory().cacheOnDisc().build();

		GridView gridView = (GridView) findViewById(R.id.gridview);
		gridView.setAdapter(new ImageAdapter());
		gridView.setOnItemClickListener(new OnItemClickListener()
		{
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id)
			{
				startImageGalleryActivity(position);
			}
		});
	}

	@Override
	protected void onStop()
	{
		imageLoader.stop();
		super.onStop();
	}

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

	public class ImageAdapter extends BaseAdapter
	{
		@Override
		public int getCount()
		{
			return imageUrls.length;
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent)
		{
			final ImageView imageView;
			if (convertView == null)
			{
				imageView = (ImageView) getLayoutInflater().inflate(
						R.layout.item_grid_image, parent, false);
			} else
			{
				imageView = (ImageView) convertView;
			}

			imageLoader.displayImage(imageUrls[position], imageView, options,
					new SimpleImageLoadingListener()
					{
						@Override
						public void onLoadingComplete()
						{
							Animation anim = AnimationUtils.loadAnimation(
									ImageGridActivity.this, R.anim.fade_in);
							imageView.setAnimation(anim);
							anim.start();
						}
					});

			return imageView;
		}
	}
}

第三种ImagePager效果,如图:


测试关键实现如下:

  1. public class ImagePagerActivity extends BaseActivity
  2. {
  3. private ViewPager pager;
  4. private DisplayImageOptions options;
  5. public void onCreate(Bundle savedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.ac_image_pager);
  9. Bundle bundle = getIntent().getExtras();
  10. String[] imageUrls = bundle.getStringArray(Extra.IMAGES);
  11. int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);
  12. options = new DisplayImageOptions.Builder()
  13. .showImageForEmptyUri(R.drawable.image_for_empty_url)
  14. .cacheOnDisc().imageScaleType(ImageScaleType.EXACT).build();
  15. pager = (ViewPager) findViewById(R.id.pager);
  16. pager.setAdapter(new ImagePagerAdapter(imageUrls));
  17. pager.setCurrentItem(pagerPosition);
  18. }
  19. @Override
  20. protected void onStop()
  21. {
  22. imageLoader.stop();
  23. super.onStop();
  24. }
  25. private class ImagePagerAdapter extends PagerAdapter
  26. {
  27. private String[] images;
  28. private LayoutInflater inflater;
  29. ImagePagerAdapter(String[] images)
  30. {
  31. this.images = images;
  32. inflater = getLayoutInflater();
  33. }
  34. @Override
  35. public void destroyItem(View container, int position, Object object)
  36. {
  37. ((ViewPager) container).removeView((View) object);
  38. }
  39. @Override
  40. public void finishUpdate(View container)
  41. {
  42. }
  43. @Override
  44. public int getCount()
  45. {
  46. return images.length;
  47. }
  48. @Override
  49. public Object instantiateItem(View view, int position)
  50. {
  51. final FrameLayout imageLayout = (FrameLayout) inflater.inflate(
  52. R.layout.item_pager_image, null);
  53. final ImageView imageView = (ImageView) imageLayout
  54. .findViewById(R.id.image);
  55. final ProgressBar spinner = (ProgressBar) imageLayout
  56. .findViewById(R.id.loading);
  57. imageLoader.displayImage(images[position], imageView, options,
  58. new ImageLoadingListener()
  59. {
  60. @Override
  61. public void onLoadingStarted()
  62. {
  63. spinner.setVisibility(View.VISIBLE);
  64. }
  65. @Override
  66. public void onLoadingFailed(FailReason failReason)
  67. {
  68. String message = null;
  69. switch (failReason)
  70. {
  71. case IO_ERROR:
  72. message = "Input/Output error";
  73. break;
  74. case OUT_OF_MEMORY:
  75. message = "Out Of Memory error";
  76. break;
  77. case UNKNOWN:
  78. message = "Unknown error";
  79. break;
  80. }
  81. Toast.makeText(ImagePagerActivity.this, message,
  82. Toast.LENGTH_SHORT).show();
  83. spinner.setVisibility(View.GONE);
  84. imageView
  85. .setImageResource(android.R.drawable.ic_delete);
  86. }
  87. @Override
  88. public void onLoadingComplete()
  89. {
  90. spinner.setVisibility(View.GONE);
  91. Animation anim = AnimationUtils.loadAnimation(
  92. ImagePagerActivity.this, R.anim.fade_in);
  93. imageView.setAnimation(anim);
  94. anim.start();
  95. }
  96. @Override
  97. public void onLoadingCancelled()
  98. {
  99. // Do nothing
  100. }
  101. });
  102. ((ViewPager) view).addView(imageLayout, 0);
  103. return imageLayout;
  104. }
  105. @Override
  106. public boolean isViewFromObject(View view, Object object)
  107. {
  108. return view.equals(object);
  109. }
  110. @Override
  111. public void restoreState(Parcelable state, ClassLoader loader)
  112. {
  113. }
  114. @Override
  115. public Parcelable saveState()
  116. {
  117. return null;
  118. }
  119. @Override
  120. public void startUpdate(View container)
  121. {
  122. }
  123. }
  124. }
public class ImagePagerActivity extends BaseActivity
{

	private ViewPager pager;

	private DisplayImageOptions options;

	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		setContentView(R.layout.ac_image_pager);
		Bundle bundle = getIntent().getExtras();
		String[] imageUrls = bundle.getStringArray(Extra.IMAGES);
		int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);

		options = new DisplayImageOptions.Builder()
				.showImageForEmptyUri(R.drawable.image_for_empty_url)
				.cacheOnDisc().imageScaleType(ImageScaleType.EXACT).build();

		pager = (ViewPager) findViewById(R.id.pager);
		pager.setAdapter(new ImagePagerAdapter(imageUrls));
		pager.setCurrentItem(pagerPosition);
	}

	@Override
	protected void onStop()
	{
		imageLoader.stop();
		super.onStop();
	}

	private class ImagePagerAdapter extends PagerAdapter
	{

		private String[] images;
		private LayoutInflater inflater;

		ImagePagerAdapter(String[] images)
		{
			this.images = images;
			inflater = getLayoutInflater();
		}

		@Override
		public void destroyItem(View container, int position, Object object)
		{
			((ViewPager) container).removeView((View) object);
		}

		@Override
		public void finishUpdate(View container)
		{
		}

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

		@Override
		public Object instantiateItem(View view, int position)
		{
			final FrameLayout imageLayout = (FrameLayout) inflater.inflate(
					R.layout.item_pager_image, null);
			final ImageView imageView = (ImageView) imageLayout
					.findViewById(R.id.image);
			final ProgressBar spinner = (ProgressBar) imageLayout
					.findViewById(R.id.loading);

			imageLoader.displayImage(images[position], imageView, options,
					new ImageLoadingListener()
					{
						@Override
						public void onLoadingStarted()
						{
							spinner.setVisibility(View.VISIBLE);
						}

						@Override
						public void onLoadingFailed(FailReason failReason)
						{
							String message = null;
							switch (failReason)
							{
							case IO_ERROR:
								message = "Input/Output error";
								break;
							case OUT_OF_MEMORY:
								message = "Out Of Memory error";
								break;
							case UNKNOWN:
								message = "Unknown error";
								break;
							}
							Toast.makeText(ImagePagerActivity.this, message,
									Toast.LENGTH_SHORT).show();

							spinner.setVisibility(View.GONE);
							imageView
									.setImageResource(android.R.drawable.ic_delete);
						}

						@Override
						public void onLoadingComplete()
						{
							spinner.setVisibility(View.GONE);
							Animation anim = AnimationUtils.loadAnimation(
									ImagePagerActivity.this, R.anim.fade_in);
							imageView.setAnimation(anim);
							anim.start();
						}

						@Override
						public void onLoadingCancelled()
						{
							// Do nothing
						}
					});

			((ViewPager) view).addView(imageLayout, 0);
			return imageLayout;
		}

		@Override
		public boolean isViewFromObject(View view, Object object)
		{
			return view.equals(object);
		}

		@Override
		public void restoreState(Parcelable state, ClassLoader loader)
		{
		}

		@Override
		public Parcelable saveState()
		{
			return null;
		}

		@Override
		public void startUpdate(View container)
		{
		}
	}
}

第四种ImageGallery效果如图:


测试关键代码:

  1. public class ImageGalleryActivity extends BaseActivity
  2. {
  3. private Gallery gallery;
  4. private DisplayImageOptions options;
  5. public void onCreate(Bundle savedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.ac_image_gallery);
  9. Bundle bundle = getIntent().getExtras();
  10. String[] imageUrls = bundle.getStringArray(Extra.IMAGES);
  11. int galleryPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);
  12. options = new DisplayImageOptions.Builder()
  13. .showImageForEmptyUri(R.drawable.image_for_empty_url)
  14. .showStubImage(R.drawable.stub_image).cacheInMemory()
  15. .cacheOnDisc().build();
  16. gallery = (Gallery) findViewById(R.id.gallery);
  17. gallery.setAdapter(new ImagePagerAdapter(imageUrls));
  18. gallery.setSelection(galleryPosition);
  19. }
  20. @Override
  21. protected void onStop()
  22. {
  23. imageLoader.stop();
  24. super.onStop();
  25. }
  26. private class ImagePagerAdapter extends BaseAdapter
  27. {
  28. private String[] images;
  29. private LayoutInflater inflater;
  30. ImagePagerAdapter(String[] images)
  31. {
  32. this.images = images;
  33. inflater = getLayoutInflater();
  34. }
  35. @Override
  36. public int getCount()
  37. {
  38. return images.length;
  39. }
  40. @Override
  41. public Object getItem(int position)
  42. {
  43. return position;
  44. }
  45. @Override
  46. public long getItemId(int position)
  47. {
  48. return position;
  49. }
  50. @Override
  51. public View getView(int position, View convertView, ViewGroup parent)
  52. {
  53. ImageView imageView = (ImageView) convertView;
  54. if (imageView == null)
  55. {
  56. imageView = (ImageView) inflater.inflate(
  57. R.layout.item_gallery_image, parent, false);
  58. }
  59. imageLoader.displayImage(images[position], imageView, options);
  60. return imageView;
  61. }
  62. }
  63. }
public class ImageGalleryActivity extends BaseActivity
{

	private Gallery gallery;

	private DisplayImageOptions options;

	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		setContentView(R.layout.ac_image_gallery);
		Bundle bundle = getIntent().getExtras();
		String[] imageUrls = bundle.getStringArray(Extra.IMAGES);
		int galleryPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);

		options = new DisplayImageOptions.Builder()
				.showImageForEmptyUri(R.drawable.image_for_empty_url)
				.showStubImage(R.drawable.stub_image).cacheInMemory()
				.cacheOnDisc().build();

		gallery = (Gallery) findViewById(R.id.gallery);
		gallery.setAdapter(new ImagePagerAdapter(imageUrls));
		gallery.setSelection(galleryPosition);
	}

	@Override
	protected void onStop()
	{
		imageLoader.stop();
		super.onStop();
	}

	private class ImagePagerAdapter extends BaseAdapter
	{

		private String[] images;
		private LayoutInflater inflater;

		ImagePagerAdapter(String[] images)
		{
			this.images = images;
			inflater = getLayoutInflater();
		}

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

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent)
		{
			ImageView imageView = (ImageView) convertView;
			if (imageView == null)
			{
				imageView = (ImageView) inflater.inflate(
						R.layout.item_gallery_image, parent, false);
			}
			imageLoader.displayImage(images[position], imageView, options);
			return imageView;
		}
	}
}

实例中通过imageLoader成员负责图片操作!初始化如下:

  1. protected ImageLoader imageLoader = ImageLoader.getInstance();
protected ImageLoader imageLoader = ImageLoader.getInstance();

此处主要是围绕UniversalImageLoader使用的介绍!~代码不难。

学习的目标是成熟!~


项目下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值