android异步加载网络图片
1.异步加载图片类
package com.mingda.show.util.image;
import java.io.File;
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;
import java.lang.ref.SoftReference; import java.util.HashMap;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message;
import android.widget.ImageView; /**
* 异步图片加载类 *
* @author wanghao * */
public class AsyncBitmapLoader { /**
* 内存图片软应用缓存 */
private HashMap * 本地图片缓存路径 */ private static final String cacheLocation = \"/mnt/sdcard/test/\"; /** * 构造函数 */ public AsyncBitmapLoader() { imageCache = new HashMap public Bitmap loadBitmap(final ImageView imageView, final String imageURL, final ImageCallBack imageCallBack) { /** * 如果在内存缓存中,则返回Bitmap对象 */ if (imageCache.containsKey(imageURL)) { SoftReference Bitmap bitmap = reference.get(); if (bitmap != null) { return bitmap; } } else { /** * 如果没有缓存,则在本地缓存中查找 */ String bitmapName = imageURL.substring(imageURL.lastIndexOf(\"/\") + 1); File cacheDir = new File(cacheLocation); File[] cacheFiles = cacheDir.listFiles(); int i = 0; if (null != cacheFiles) { for (; i < cacheFiles.length; i++) { if (bitmapName.equals(cacheFiles[i].getName())) { break; } } if (i < cacheFiles.length) { return BitmapFactory.decodeFile(cacheLocation + bitmapName); } } } final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { imageCallBack.imageLoad(imageView, (Bitmap) msg.obj); } }; /** * 如果不在本地内存缓存中,也不在本地(被JVM回收掉),则开启线程下载图片 */ new Thread(){ @Override public void run() { InputStream bitmapIs = HttpUtils.getStreamFromURL(imageURL); Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs); imageCache.put(imageURL, new SoftReference Message msg = handler.obtainMessage(0, bitmap); handler.sendMessage(msg); File dir = new File(cacheLocation); if (!dir.exists()) { dir.mkdirs(); } File bitmapFile = new File(cacheLocation + imageURL.substring(imageURL.lastIndexOf(\"/\") + 1)); if (!bitmapFile.exists()) { try { bitmapFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } FileOutputStream fos; try { fos = new FileOutputStream(bitmapFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } catch (Exception e) { e.printStackTrace(); } } }.start(); return null; } public interface ImageCallBack { public void imageLoad(ImageView imageView, Bitmap bitmap); } } 2.网络获取类 package com.mingda.show.util.image; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * * 网络获取类 * * @author wanghao * */ public class HttpUtils { /** * * 根据URL获取输入流对象 * * @param imageURL 文件URL地址 * * @return 输入流对象 * */ public static InputStream getStreamFromURL(String imageURL) { InputStream in = null; try { URL url = new URL(imageURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); in = connection.getInputStream(); } catch (Exception e) { e.printStackTrace(); } return in; } } 3.适配器类getview方法加载图片片段 /** * 设置图片 */ String image_path = info.getImageUrl(); //异步加载图片 Bitmap bitmap = asyncBitmapLoader.loadBitmap(holder.appImage, image_path, new ImageCallBack() { public void imageLoad(ImageView imageView, Bitmap bitmap) { imageView.setImageBitmap(bitmap); } }); //设置默认图片 if (bitmap == null) { holder.appImage.setImageResource(R.drawable.empty_photo); } else { holder.appImage.setImageBitmap(bitmap); } 4.注意在AndroidManifest.xml文件中加入网络访问和写SDCard的权限,不然会报java.net.SocketException: Permission denied和FileNotFound的异常。 因篇幅问题不能全部显示,请点此查看更多更全内容