listview 异步加载的核心类

package com.qi.testimg;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.SoftReference;
import java.util.HashMap;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;


import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;


/**
 * 异步加载类,负责后台加载图片
 * 
 * @author Administrator
 * 
 */
public class AsyncImgLoader {
	private final String tag = "AsyncImgLoader";


	// 软引用缓存图片
	private HashMap<String, SoftReference<Bitmap>> imgCache;


	//
	public AsyncImgLoader() {
		this.imgCache = new HashMap<String, SoftReference<Bitmap>>();
	}


	public interface ImageCallBack {
		public void imageLoad(Bitmap imgage, ImageView imageViw);
	}


	/**
	 * 获取图片
	 * 
	 * @param imgUrl
	 * @param imageCallback
	 * @return
	 */
	@SuppressLint("HandlerLeak")
	public Bitmap loadDrawalbe(final String imgUrl,
			final ImageCallBack imageCallback, final ImageView imgview) {
		//1.缓存
		if (imgCache.containsKey(imgUrl)) { // 内存缓存中包含图片
			SoftReference<Bitmap> softReference = imgCache.get(imgUrl);
			Bitmap bitmap = softReference.get();
			Log.i(tag, "缓存中获取图片");
			return bitmap;
		}
		//2.本地SD卡
		final String filename = imgUrl.substring(imgUrl.lastIndexOf("/")+1);
		Bitmap sdtemp = loadImageFromLocal(filename);
		if(sdtemp != null){
			Log.i(tag, "本地SD获取");
			return  sdtemp;
		}
		
		// handler处理更新
		final Handler handler = new Handler() {
			public void handleMessage(android.os.Message msg) {
				imageCallback.imageLoad((Bitmap) msg.obj, imgview); // 回调接口处理更新
			};
		};
		// 采用线程从网上或者本地SD卡中读取图片
		new Thread(new Runnable() {
			public void run() {
				// TODO Auto-generated method stub
				Bitmap bitMap = loadImage(imgUrl);
				SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(
						bitMap);
				imgCache.put(imgUrl, softReference);
				Message message = new Message();
				message.obj = bitMap;
				handler.sendMessage(message);
				saveImageToLocal(bitMap, filename);
				Log.i(tag, "网路获取图片");
			}
		}).start();
		return null;


	}


	/**
	 * 获取图片信息,本地SD卡或者网络图片
	 * 
	 * @param url
	 * @return
	 */
	private Bitmap loadImage(String url) {
		return loadImageFormNet(url);
	}


	/**
	 * 从网络获取图片信息
	 * 
	 * @param url
	 * @return
	 */
	private Bitmap loadImageFormNet(String url) {
		InputStream is = null;
		try {
			HttpGet get = new HttpGet(url);
			HttpClient client = new DefaultHttpClient();
			HttpResponse respone = client.execute(get);
			if (respone.getStatusLine().getStatusCode() == 200) { // 响应成功
				HttpEntity entity = respone.getEntity();
				is = entity.getContent();
				Bitmap biemaptem = BitmapFactory.decodeStream(is);
				is.close();
				return biemaptem;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 从本地加载图片
	 * 
	 * @param url
	 * @return
	 */
	private Bitmap loadImageFromLocal(String filename) {


		// 1,SD卡是否存在
		if (!Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			return null;
		}
		File f = new File(Environment.getExternalStorageDirectory()
				+ "/sunbird/image/");
		File sf = new File(f,filename);
		if(!sf.exists()) return  null;   //本地不存在
		InputStream is = null;
		try {
			 is = new FileInputStream(sf);
			 Bitmap bitmap =BitmapFactory.decodeStream(is);
			 is.close();
			 return bitmap;
		} catch (Exception e) {
			e.printStackTrace();
			return  null;
		}
	}


	/**
	 * 将图像文件保存在本地SD卡中
	 * 
	 * @param bitmap
	 */
	private void saveImageToLocal(Bitmap bitmap, String fileName) {
		// 1,SD卡是否存在
		if (!Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			return;
		}
		File f = new File(Environment.getExternalStorageDirectory()
				+ "/sunbird/image");
		if (!f.exists()) { // 创建目录
			f.mkdirs();
		}
		// 保存的文件
		File saveFile = null ;
		try {
			saveFile = new File(f, fileName);
			if (!saveFile.exists())
				saveFile.createNewFile();
			OutputStream fos = new FileOutputStream(saveFile);
			if(bitmap != null){
				bitmap.compress(CompressFormat.PNG, 100, fos);
			}
			fos.flush();
			fos.close();
		} catch (Exception e) {
			saveFile.delete();
			e.printStackTrace();
		}
	}


}

1.这个能够实现基本的需求,当然后期肯定还有很多需要改动的地方

2.加载的步骤

1.软引用

2.SD卡

3.网络下载

4.保存到SD卡操作时下载线程里操作的,读取则没有,不知道读取的速度会不会太慢?  目前测试没有发现,能够满足需求

5.该方法使用过程中需要在Adapter中设置图片的默认图片,否则会出现图片错位现象


你可能感兴趣的:(listview 异步加载的核心类)