// // _/_/_/ _/ _/_/_/_/_/ // _/ _/_/ _/_/ _/ _/ _/ _/_/ _/_/ // _/ _/_/ _/_/_/_/ _/_/_/_/ _/_/ _/ _/ _/ _/ _/ // _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ // _/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/_/_/_/ _/_/ _/_/ // // // Copyright (c) 2015-2016, Geek Zoo Studio // http://www.geek-zoo.com // // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // package com.BeeFramework.view; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import java.io.*; import java.lang.ref.SoftReference; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; public class AsyncImageLoader { private HashMap<String, SoftReference<Bitmap>> imageCache; public AsyncImageLoader() { imageCache = new HashMap<String, SoftReference<Bitmap>>(); } /** * 载入图片资源,如果缓存中不存在图片资源,则从本地加载,本地没有则从网络下载 * * @param imageUrl * @param imageCallback * @param localPath 缓存到本地的图片 * @return */ public Bitmap loadDrawable(final String imageUrl,final String localPath,final ImageCallback imageCallback) { final String fileName = imageUrl.substring(imageUrl.lastIndexOf("/")); if (imageCache.containsKey(imageUrl)) { SoftReference<Bitmap> softReference = imageCache.get(imageUrl); Bitmap drawable = softReference.get(); if (drawable != null) { return drawable; } } File file = new File(localPath+fileName); // System.out.println("文件"+(localPath+fileName)+file.exists()); if (file.exists()) { System.out.println("SD卡存在图片文件:"+file.getAbsolutePath()); Bitmap drawable = BitmapFactory.decodeFile(localPath+fileName); imageCache.put(imageUrl, new SoftReference<Bitmap>(drawable)); return drawable; } final Handler handler = new Handler() { public void handleMessage(Message message) { if (imageCallback != null) { imageCallback.imageLoaded((Bitmap) message.obj, imageUrl); } } }; new Thread() { @Override public void run() { if (imageUrl != null) { String localFilePath = saveUrlAsFile(imageUrl,localPath); System.out.println("异步下载AsyncImageLoader*******"+imageUrl); System.out.println("异步下载AsyncImageLoader*******"+localPath); if(localFilePath!=null){ Bitmap drawable = BitmapFactory.decodeFile(localPath+fileName); imageCache.put(imageUrl, new SoftReference<Bitmap>(drawable)); Message msg = handler.obtainMessage(0, drawable); handler.sendMessage(msg); }else{ // System.out.println("异步下载的图片为空!"); } // Bitmap drawable = loadImageFromUrl(imageUrl); // imageCache.put(imageUrl,new SoftReference<Bitmap>(drawable)); // Message msg = handler.obtainMessage(0, drawable); // handler.sendMessage(msg); } } }.start(); return null; } public Bitmap loadImageFromUrl(String url) { URL m = null; InputStream i = null; BufferedInputStream bis = null; ByteArrayOutputStream out = null; Bitmap bitmap = null; try { m = new URL(url); i = (InputStream) m.getContent(); bis = new BufferedInputStream(i, 1024 * 8); out = new ByteArrayOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = bis.read(buffer)) != -1) { out.write(buffer, 0, len); } byte[] data = out.toByteArray(); BitmapFactory.Options opts = new BitmapFactory.Options(); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts); out.close(); bis.close(); i.close(); return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 把网络上的图片下载并存储到本地磁盘 * @param fileUrl * @param savePath * @return */ public static String saveUrlAsFile(String fileUrl, String savePath)/*fileUrl网络资源地址*/ { String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")); File dir = new File(savePath); if(!dir.exists()){ dir.mkdirs(); } File file = new File(savePath+fileName); if(!file.exists()){ try { file.getParentFile().mkdirs(); } catch (Exception e) { e.printStackTrace(); } } try { URL url = new URL(fileUrl);/*将网络资源地址传给,即赋值给url*/ /*此为联系获得网络资源的固定格式用法,以便后面的in变量获得url截取网络资源的输入流*/ HttpURLConnection connection = (HttpURLConnection)url.openConnection(); DataInputStream in = new DataInputStream(connection.getInputStream()); /*此处也可用BufferedInputStream与BufferedOutputStream*/ DataOutputStream out = new DataOutputStream(new FileOutputStream(file)); /*将参数savePath,即将截取的图片的存储在本地地址赋值给out输出流所指定的地址*/ byte[] buffer = new byte[4096]; int count = 0; int num = 0; while ((count = in.read(buffer)) > 0)/*将输入流以字节的形式读取并写入buffer中*/ { num += count; out.write(buffer, 0, count); } out.close();/*后面三行为关闭输入输出流以及网络资源的固定格式*/ in.close(); connection.disconnect(); if(num==0){ file.delete(); return null; } return savePath+fileName;/*网络资源截取并存储本地成功返回true*/ } catch (Exception e) { System.out.println(e + fileUrl + savePath); return null; } } public Bitmap loadImageFromUrl2(String url) { URL m; InputStream i = null; BufferedInputStream bis = null; ByteArrayOutputStream out = null; try { m = new URL(url); i = (InputStream) m.getContent(); bis = new BufferedInputStream(i, 1024 * 8); out = new ByteArrayOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = bis.read(buffer)) != -1) { out.write(buffer, 0, len); } byte[] data = out.toByteArray(); BitmapFactory.Options opts = new BitmapFactory.Options(); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); out.close(); bis.close(); i.close(); // Drawable d = Drawable.createFromStream(i, "src"); return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } } /*** * 从SD卡读取Android文件 * * @param url */ public void loadImageFromSDCard(String url) { } public interface ImageCallback { public void imageLoaded(Bitmap imageDrawable, String imageUrl); } }