异步加载图片的模块,图片的软引用

使用该模块的方法:创建LoadImageAsyncTask对象的时候必须传入一个LoadImageAsyncTaskCallback接口的实现类,实际调用该类的方法来完成加载图片前后的工作.


public class LoadImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
		LoadImageAsyncTaskCallback loadImageAsyncTaskCallback;

		public LoadImageAsyncTask(LoadImageAsyncTaskCallback loadImageAsyncTaskCallback) {
			super();
			this.loadImageAsyncTaskCallback = loadImageAsyncTaskCallback;
		}

		public interface LoadImageAsyncTaskCallback {
			public void beforeLoadImage();

			public void afterLoadImage(Bitmap bitmap);
		}

		@Override
		protected void onPreExecute() {
			loadImageAsyncTaskCallback.beforeLoadImage();
			super.onPreExecute();
		}

		@Override
		protected void onPostExecute(Bitmap result) {
			loadImageAsyncTaskCallback.afterLoadImage(result);
			super.onPostExecute(result);
		}

		@Override
		protected Bitmap doInBackground(String... params) {

			if (params.length >= 1) {
				try {
					String path = params[0];
					final File file = new File(Environment.getExternalStorageDirectory()+"/cache", URLEncoder.encode(path));
					if (file.exists()) {
						FileInputStream is = new FileInputStream(file);
						System.out.println("使用SD卡缓存图片");
						return BitmapFactory.decodeStream(is);
					} else {

						URL url = new URL(path);
						HttpURLConnection conn = (HttpURLConnection) url.openConnection();
						InputStream inputStream = conn.getInputStream();
						final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
						new Thread(){

							@Override
							public void run() {
								try {
									OutputStream stream = new FileOutputStream(file);
									bitmap.compress(CompressFormat.JPEG, 100, stream );
								} catch (FileNotFoundException e) {
									e.printStackTrace();
								}
							}
							
						}.start();
						System.out.println("使用下载图片");
						return bitmap;
					}
				} catch (Exception e) {
					e.printStackTrace();
					return null;
				}
			} else {
				return null;
			}
		}

	}

图片的软引用: 软引用能够极大地提高加载图片的效率:

		private Map<String, SoftReference<Bitmap>> map = new HashMap<String, SoftReference<Bitmap>>();//定义成员变量
		//代码中:
		if (map.containsKey(imagePath)) {
			SoftReference<Bitmap> softReference = map.get(imagePath);
			if (softReference != null) {
				Bitmap bitmap = softReference.get();
				if (bitmap != null) {
					System.out.println("使用内存缓存图片");
					book_img.setImageBitmap(bitmap);
				} else {
					loadImage(book_img, imagePath);		//使用非软引用方式加载图片.
				}
			} else {
				loadImage(book_img, imagePath);
			}
		} else {
			loadImage(book_img, imagePath);
		}
		
		private void loadImage(final ImageView book_img, final String imagePath) {
			new LoadImageAsyncTask(new LoadImageAsyncTaskCallback() {

				public void beforeLoadImage() {

				}

				public void afterLoadImage(Bitmap bitmap) {
					if (bitmap != null) {
						book_img.setImageBitmap(bitmap);
						map.put(imagePath, new SoftReference<Bitmap>(bitmap));	//在使用非软引用方式加载图片时,将图片保存到软件引													//用中.
					}
				}
			}).execute(imagePath);
		}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值