Android开发ListView控件异步加载图片

本文探讨了在Android开发中如何利用AsyncTask类优化ListView性能,特别是针对大量图片缩略图的异步加载策略。通过在后台线程处理图片加载,并在主线程更新UI,实现了界面快速响应,提升用户体验。

写博客总是三天打鱼,,两天晒网....今天又来补补android开发的内容

之前在完成ImageView浏览图片的时候,还有一块内容忘了总结了,就是ListView中显示缩略图时,异步加载图片的功能。

这个功能应用在网络上获取图片时比较多。我是在打开预览图片界面的时候,发现图片很多的情况下打开很慢,,由于我压缩bitmap的效率比较低..所以我在这里另外开了一个线程来获得listview中的bitmap,这样打开界面就很快了。

这里使用的是AsyncTask类,可以直接操作控件

需要重写两个函数,如下

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。

onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

所以我们就在doInBackground函数中通过图片文件名得到Bitmap对象,然后在onPostExecute中将bitmap显示在ImageVIew中。。。就ok~

public class BmpAsyncTask extends AsyncTask<String, Void, Bitmap> {

		private final WeakReference<ImageView> imageViewReference;
		private String data = "";
		private ImageView mImgView;
		private List<Bitmap> mListBmp;

		public BmpAsyncTask(ImageView imageView, List<Bitmap> listBmp) {
			imageViewReference = new WeakReference<ImageView>(imageView);
			mImgView = imageView;
			mListBmp = listBmp;
		}

		@Override
		protected Bitmap doInBackground(String... params) {
			data = params[0];
			File file = new File(data);
			Bitmap bmp = null;
			// System.out.println("data:"+data);
			if (data.endsWith(".jpg") || data.endsWith(".png")) {
				bmp = PublicMethod.getBitmapFromFile(file, mImgView.getWidth(),
						mImgView.getWidth());
			} else if (data.endsWith(".mp4")) {
				bmp = ThumbnailUtils.createVideoThumbnail(data,
						MediaStore.Images.Thumbnails.MINI_KIND);
			}
			// bmp=ThumbnailUtils.extractThumbnail(bmp, 100, 100,
			// ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
			mListBmp.add(bmp);
			return bmp;
		}

		@Override
		protected void onPostExecute(Bitmap bitmap) {
			if (imageViewReference != null && bitmap != null) {
				final ImageView imageView = imageViewReference.get();
				if (imageView != null) {
					imageView.setImageBitmap(bitmap);
				}
			}
		}
	}

调用上述线程只要通过构造函数和execute方法传入参数即可。

BmpAsyncTask bmpTask = new BmpAsyncTask(imgView, m_listBmp);
bmpTask.execute(file.getAbsolutePath());


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值