Android异步加载图片,并缓存到SD卡,这些都是一些代码片段,需要的时候可以用上,很不错的。

public class MemoryCache {private static final String TAG = "MemoryCache";// Collections.synchronizedMap()的方法包装成一个线程安全的Map/Setprivate Map<String, Bitmap> cache = Collections.synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.5f, true));// Last argument true for LRU orderingprivate long size = 0;// current allocated sizeprivate long limit = 1000000;// max memory in bytespublic MemoryCache() {// use 25% of available heap sizesetLimit(Runtime.getRuntime().maxMemory() / 4);}public void setLimit(long new_limit) {limit = new_limit;Log.i(TAG, "MemoryCache will use up to " + limit / 1024. / 1024. + "MB");}public Bitmap get(String id) {try {if (!cache.containsKey(id)) {return null;}// NullPointerException sometimes happen here// http://code.google.com/p/osmdroid/issues/detail?id=78return cache.get(id);} catch (NullPointerException ex) {ex.printStackTrace();return null;}}public void put(String id, Bitmap bitmap) {try {if (cache.containsKey(id)) {size -= getSizeInBytes(cache.get(id));}cache.put(id, bitmap);size += getSizeInBytes(bitmap);checkSize();} catch (Throwable th) {th.printStackTrace();}}private void checkSize() {Log.i(TAG, "cache size=" + size + " length=" + cache.size());if (size > limit) {Iterator<Entry<String, Bitmap>> iter = cache.entrySet().iterator();// least recently accessed item will be the first one iteratedwhile (iter.hasNext()) {Entry<String, Bitmap> entry = iter.next();size -= getSizeInBytes(entry.getValue());iter.remove();if (size <= limit)break;}Log.i(TAG, "Clean cache. New size " + cache.size());}}public void clear() {try {// NullPointerException sometimes happen here// http://code.google.com/p/osmdroid/issues/detail?id=78cache.clear();size = 0;} catch (NullPointerException ex) {ex.printStackTrace();}}long getSizeInBytes(Bitmap bitmap) {if (bitmap == null)return 0;return bitmap.getRowBytes() * bitmap.getHeight();}}


下面是FileCache类:

public class FileCache {private File cacheDir;public FileCache(Context context) {// Find the dir to save cached imagesif (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"Cngolf");elsecacheDir = context.getCacheDir();if (!cacheDir.exists())cacheDir.mkdirs();}public File getFile(String url) {// I identify images by hashcode. Not a perfect solution, good for the// demo.String filename = String.valueOf(url.hashCode());// Another possible solution (thanks to grantland)// String filename = URLEncoder.encode(url);File f = new File(cacheDir, filename);return f;}public void clear() {File[] files = cacheDir.listFiles();if (files == null)return;for (File f : files)f.delete();}}


Utils类:

public class Utils {public static void CopyStream(InputStream is, OutputStream os) {final int buffer_size = 1024;try {byte[] bytes = new byte[buffer_size];for (;;) {int count = is.read(bytes, 0, buffer_size);if (count == -1)break;os.write(bytes, 0, count);}} catch (Exception ex) {}}}


下面是非常重要的代码来的:

public class ImageLoader {MemoryCache memoryCache = new MemoryCache();FileCache fileCache;private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());ExecutorService executorService;Handler handler = new Handler();// handler to display images in UI threadpublic ImageLoader(Context context) {fileCache = new FileCache(context);executorService = Executors.newFixedThreadPool(5);}final int stub_id = R.drawable.stub;public void DisplayImage(String url, ImageView imageView) {imageViews.put(imageView, url);Bitmap bitmap = memoryCache.get(url);if (bitmap != null)imageView.setImageBitmap(bitmap);else {queuePhoto(url, imageView);imageView.setImageResource(stub_id);}}private void queuePhoto(String url, ImageView imageView) {PhotoToLoad p = new PhotoToLoad(url, imageView);executorService.submit(new PhotosLoader(p));}private Bitmap getBitmap(String url) {File f = fileCache.getFile(url);// from SD cacheBitmap b = decodeFile(f);if (b != null)return b;// from webtry {Bitmap bitmap = null;URL imageUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();conn.setConnectTimeout(30000);conn.setReadTimeout(30000);conn.setInstanceFollowRedirects(true);InputStream is = conn.getInputStream();OutputStream os = new FileOutputStream(f);Utils.CopyStream(is, os);os.close();conn.disconnect();bitmap = decodeFile(f);return bitmap;} catch (Throwable ex) {ex.printStackTrace();if (ex instanceof OutOfMemoryError)memoryCache.clear();return null;}}// decodes image and scales it to reduce memory consumptionprivate Bitmap decodeFile(File f) {try {// decode image sizeBitmapFactory.Options o = new BitmapFactory.Options();o.inJustDecodeBounds = true;FileInputStream stream1 = new FileInputStream(f);BitmapFactory.decodeStream(stream1, null, o);stream1.close();// Find the correct scale value. It should be the power of 2.final int REQUIRED_SIZE = 70;int width_tmp = o.outWidth, height_tmp = o.outHeight;int scale = 1;while (true) {if (width_tmp / 2 < REQUIRED_SIZE|| height_tmp / 2 < REQUIRED_SIZE)break;width_tmp /= 2;height_tmp /= 2;scale *= 2;}// decode with inSampleSizeBitmapFactory.Options o2 = new BitmapFactory.Options();o2.inSampleSize = scale;FileInputStream stream2 = new FileInputStream(f);Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);stream2.close();return bitmap;} catch (FileNotFoundException e) {} catch (IOException e) {e.printStackTrace();}return null;}// Task for the queueprivate class PhotoToLoad {public String url;public ImageView imageView;public PhotoToLoad(String u, ImageView i) {url = u;imageView = i;}}class PhotosLoader implements Runnable {PhotoToLoad photoToLoad;PhotosLoader(PhotoToLoad photoToLoad) {this.photoToLoad = photoToLoad;}@Overridepublic void run() {try {if (imageViewReused(photoToLoad))return;Bitmap bmp = getBitmap(photoToLoad.url);memoryCache.put(photoToLoad.url, bmp);if (imageViewReused(photoToLoad))return;BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);handler.post(bd);} catch (Throwable th) {th.printStackTrace();}}}boolean imageViewReused(PhotoToLoad photoToLoad) {String tag = imageViews.get(photoToLoad.imageView);if (tag == null || !tag.equals(photoToLoad.url))return true;return false;}// Used to display bitmap in the UI threadclass BitmapDisplayer implements Runnable {Bitmap bitmap;PhotoToLoad photoToLoad;public BitmapDisplayer(Bitmap b, PhotoToLoad p) {bitmap = b;photoToLoad = p;}public void run() {if (imageViewReused(photoToLoad))return;if (bitmap != null)photoToLoad.imageView.setImageBitmap(bitmap);elsephotoToLoad.imageView.setImageResource(stub_id);}}public void clearCache() {memoryCache.clear();fileCache.clear();}}

下载:http://pan.baidu.com/share/link?shareid=305578&uk=1796216265

更多相关文章

  1. Android(安卓)WebView加载HTML表单并通过javascript提交
  2. 基于TCP和多线程实现无线鼠标键盘-Socket(2)
  3. Android(安卓)OpenGL学习笔记(二)--三角形的绘制.
  4. Android中有关Handler的使用(三)
  5. TTS源码解析
  6. Android(安卓)近百个项目的源代码,覆盖Android开发的每个领域
  7. Android(安卓)代码质量工具集成与应用
  8. Android(安卓)Studio中与网站通信
  9. Android深入浅出系列课程---Lesson8 Android应用程序启动

随机推荐

  1. android中调用相册里面的图片并返回
  2. 录音及播放音频文件
  3. jamendo_android 一个开源的Android在线
  4. android中的一个属性动画,可以显示更多的
  5. Android利用Looper在子线程中改变UI
  6. 编程回忆之Android回忆(Android应用参数的
  7. android 判断 网络 类型
  8. 如何把android设备中的固件dump出来
  9. 使用NanoHTTPD在android实现web迷你服务
  10. Android 技巧 - 自动生成 Action Bar The