android异步加载图片
2015-12-08 13:26
465 查看
这是一个可以实现异步加载网络图片、并把图片保存在本地文件当中。
加载图片的时候,先在内存中寻找、如果没有在文件中寻找、如果还是没有再从网络中加载图片。
调用方法如下:
<pre name="code" class="java">AsynImageLoader mLoader = new AsyncImageLoader(); //参数一为控件id 参数二控件2为图片的URL 参数三为图片加载成功后调用的函数 mLoader.loadBitmap(ImageView img,String url,ImageCallBack imageCallBack);
具体实现类
import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; public class AsynImageLoader { private static final String FILENAME = "/mnt/sdcard/lxgame/imageload/"; /** * 内存图片软引用缓冲 */ private HashMap<String, SoftReference<Bitmap>> imageCache = null; public AsynImageLoader() { imageCache = new HashMap<>(); } public Bitmap loadBitmap(final ImageView imageView, final String imageURL, final ImageCallBack imageCallBack) { //在内存缓存中,则返回Bitmap对象 final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { imageCallBack.imageLoad(imageView, (Bitmap)msg.obj); } }; if(imageCache.containsKey(imageURL)) { SoftReference<Bitmap> reference = imageCache.get(imageURL); Bitmap bitmap = reference.get(); if(bitmap != null) { return bitmap; } } else { //本地缓存 String bitmapName = imageURL.substring(imageURL.lastIndexOf("/") + 1); File cacheDir = new File(FILENAME); 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) { Bitmap bitmap = BitmapFactory.decodeFile(FILENAME + bitmapName); Message msg = handler.obtainMessage(0,bitmap); handler.sendMessage(msg); return bitmap; } } } //如果不在内存缓存中,也不在本地,则开启线程下载图片 new Thread() { @Override public void run() { InputStream bitmapIs = getStreamFromURL(imageURL); Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs); imageCache.put(imageURL, new SoftReference<>(bitmap)); Message msg = handler.obtainMessage(0, bitmap); handler.sendMessage(msg); File dir = new File(FILENAME); if(!dir.exists()) dir.mkdirs(); File bitmapFile = new File(FILENAME + 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); fos.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); return null; } private 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; } public interface ImageCallBack { void imageLoad(ImageView imageView, Bitmap bitmap); } }
相关文章推荐
- Android自定义控件实战
- PHP服务端项目开发经历——解决Android客户端中多图片上传的问题
- Android知识点总结: setTextSize 与 getTextSize的单位各是什么
- Android 学习系列
- Android与服务器交互
- 为Fragment中的ListView添加Adapter
- Android安卓一键修改手机信息imei sim serial mac wifi 手机型号等等
- Android自定义View的实现方法,带你一步步深入了解View
- Android编译遇到点9图片错误:No marked region found along edge. - Found along left edge.
- Android-Styles and Themes
- Android注解支持(Support Annotations)
- 浅谈Android系统启动过程
- 【Android自定义View】制作老虎机Android版
- Activity生命周期
- android焦点分发无法获取到Down事件,却有Move和Up
- Android 读取蓝牙设备信息开发
- AndroidStudio学习笔记一:了解Activity
- 从源码角度分析android事件分发处理机制
- Android Studio 简单介绍和使用问题小结
- Android ListView 设置选中item高亮状态