代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
安卓图片异步加载工具类
作者:
mickelfeng
/ 发布于
2015/7/9
/
837
随手写一个安卓图片异步加载工具类,支持多线程、文件缓存、可选临时和永久缓存、过程状态监听等。使用示例: AsyncImageLoader.INSTANCE.load(imageView, url); // 加载并临时缓存 AsyncImageLoader.INSTANCE.load(imageView, url, true, true); // 加载并永久缓存
package me.lanfog.myandroid.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.ProgressBar; public enum AsyncImageLoader { INSTANCE; private String TAG = AsyncImageLoader.class.getSimpleName(); private final ExecutorService executor; private BitmapFactory.Options defaultOptions; private final String cacheDir = "/sdcard/me.lanfog.myandroid/imagecache"; AsyncImageLoader() { executor = Executors.newFixedThreadPool(10); defaultOptions = new BitmapFactory.Options(); defaultOptions.inPreferredConfig = Bitmap.Config.RGB_565; defaultOptions.inScaled = false; defaultOptions.inPurgeable = true; defaultOptions.inInputShareable = true; // 启动时,清空上次缓存 File root = new File(cacheDir); if(root.exists()){ File[] fs = root.listFiles(); for(File f:fs) if(f.isFile()) f.delete(); } } public void stop() { if (!executor.isTerminated()) executor.shutdownNow(); } public void load(ImageView iv, String url){ this.load(iv, null, url, true, false, null, null, null); // 默认临时缓存 } public void load(ImageView iv, String url, boolean cached, boolean permanent){ this.load(iv, null, url, cached, permanent, null, null, null); } /** * 加载图片 * * @param iv ImageView * @param options BitmapFactory.Options * @param url 下载地址 * @param cached 是否缓存 * @param permanent 是否永久缓存 * @param pb 进度条 * @param listener 状态监听器 * @param handler Handler */ public void load(final ImageView iv, final BitmapFactory.Options options, final String url, final boolean cached, final boolean permanent, final ProgressBar pb, final LoadStateChangedListener listener, final Handler handler){ final Handler h = handler != null ? handler : new Handler(Looper.getMainLooper()); // 必要时构造Handler executor.submit(new Runnable() { @Override public void run() { Object tag = iv.getTag(); if(tag == null || tag instanceof LoadState){ iv.setTag(new LoadState(url, listener)); } LoadState ls = (LoadState) iv.getTag(); if(ls.getState() == LoadState.STATE_LOADED && ls.getUrl().equals(url) && cached){ ls.setState(LoadState.STATE_LOADED); return; // 已经加载 } /*显示进度条*/if(pb != null) h.post(new Runnable() { @Override public void run() { pb.setVisibility(View.VISIBLE); } }); Bitmap bitmap = null; /* * 使用缓存 */ if(cached){ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File f = new File(cacheDir + ( permanent ? "/permanent" : "" ) + "/" + digest(url)); if(f.exists()){ Log.i(TAG, "load from cached: " + url); FileInputStream fis = null; try { fis = new FileInputStream(f); bitmap = BitmapFactory.decodeStream(fis, null, options == null ? defaultOptions : options); } catch (Exception e) { e.printStackTrace(); } finally { if(fis != null){ try { fis.close(); } catch (IOException e) {} } } } } } /* * 下载文件 */ if(bitmap == null){ try { Log.i(TAG, "load from network: " + url); bitmap = BitmapFactory.decodeStream((InputStream) new URL(url).getContent(), null, options == null ? defaultOptions : options); if (bitmap != null && cached && Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 缓存到文件 File dir = new File(cacheDir + "/permanent"); if (!dir.exists()) { dir.mkdirs(); } File bitmapFile = new File(cacheDir + ( permanent ? "/permanent" : "" ) + "/" + digest(url)); if (!bitmapFile.exists()) { bitmapFile.createNewFile(); } FileOutputStream fos = new FileOutputStream(bitmapFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); fos.close(); } } catch (Exception e) { e.printStackTrace(); } } /* * 处理结果 */ if(bitmap != null){ final Bitmap bm = bitmap; h.post(new Runnable() { @Override public void run() { iv.setImageBitmap(bm);} }); ls.setState(LoadState.STATE_LOADED); }else{ ls.setState(LoadState.STATE_ERROR); } /*隐藏进度条*/if(pb != null) h.post(new Runnable() { @Override public void run() { pb.setVisibility(View.GONE); } }); } }); } class LoadState { public static final int STATE_LOADING = 0; // 加载中 public static final int STATE_LOADED = 1; // 已加载 public static final int STATE_ERROR = -1; // 失败 public static final int STATE_IDLE = -2; // 空闲 private String url; // 下载地址 private int state; // 加载状态 LoadStateChangedListener listener; // 状态监听 public LoadState(String url, LoadStateChangedListener listener) { this.url = url; this.listener = listener; this.state = STATE_IDLE; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getState() { return state; } public void setState(int state) { this.state = state; if(listener != null) listener.onLoadStateChanged(state); } } public static interface LoadStateChangedListener { public void onLoadStateChanged(int state); // 加载状态改变事件 } /** * 对文本进行摘要 */ public String digest(String instr) { String s = null; char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); md.update(instr.getBytes()); byte tmp[] = md.digest(); char str[] = new char[16 * 2]; int k = 0; for (int i = 0; i < 16; i++) { byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } s = new String(str).toLowerCase(); } catch (Exception e) { } return s; } }
试试其它关键字
安卓图片
异步加载
工具类
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
mickelfeng
贡献的其它代码
(
22
)
.
安卓图片异步加载工具类
.
加密解密php代码
.
将PHP数组有格式的写入文件中
.
获取访问页面的http状态码
.
WinInet远程下载文件的
.
用NetAPI获取网卡的物理MAC地址
.
极方便的动态 SQL 生成工具
.
PHP图片缩放函数:实现等比例不失真缩放
.
判断手机移动设备访问
.
扁平化的bootstrap
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3