1.Android的MD5生成
package com.msl.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;
/**
* MD5码生成
* Created by msl on 2015/2/05.
*/
public class MD5Utils {
private static MD5Utils instance;
private final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
private MD5Utils() {}
public static MD5Utils getInstance() {
if(instance == null) {
instance = new MD5Utils();
}
return instance;
}
public String getFileMD5(String file) {
return getFileMD5(new File(file));
}
public String getFileMD5(File file) {
if(file == null) {
return null;
}
try {
InputStream is = new FileInputStream(file);
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] buf = new byte[2048];
int length;
while((length = is.read(buf)) != -1) {
messageDigest.update(buf, 0, length);
}
return byteToHexString(messageDigest.digest());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 把byte[]数组转换成十六进制字符串表示形式
* @param tmp 要转换的byte[]
* @return 十六进制字符串表示形式
*/
private String byteToHexString(byte[] tmp) {
String s;
// 用字节表示就是 16 个字节
char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
// 所以表示成 16 进制需要 32 个字符
int k = 0; // 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
// 转换成 16 进制字符的转换
byte byte0 = tmp[i]; // 取第 i 个字节
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
// >>> 为逻辑右移,将符号位一起右移
str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
}
s = new String(str); // 换后的结果转换为字符串
return s;
}
}
代码来源自百度,未验证有效性
2.Android的线程管理 线程池ThreadPool的使用
package com.msl.utils;
import android.graphics.Bitmap;
import com.chuxin.family.Constants;
import com.chuxin.family.bean.ThumbBean;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 缩略图连接池
* Created by msl on 2015/2/05.
*/
public class ThumbThreadPool {
private static ExecutorService threadpool;
private static ThumbThreadPool instance;
private static ConcurrentHashMap<Thread, ThumbBean> connMap;
private CallBack callBack;
private ThumbThreadPool() {
threadpool = Executors.newCachedThreadPool();
connMap = new ConcurrentHashMap<>();
}
public ThumbThreadPool getInstance(CallBack callBack) {
if (instance == null) {
instance = new ThumbThreadPool();
this.callBack = callBack;
}
return instance;
}
public synchronized void finish(ThumbBean thumbBean) {
if (connMap.containsValue(thumbBean)) {
connMap.remove(thumbBean);
}
}
public void handleReques(ThumbBean thumbBean) {
Thread thread = new HandleThread(thumbBean);
connMap.put(thread, thumbBean);
threadpool.equals(thread);
}
private class HandleThread extends Thread {
private ThumbBean thumbBean;
private HandleThread(ThumbBean thumbBean) {
this.thumbBean = thumbBean;
}
@Override
public void run() {
String url = thumbBean.getUrl();
//创建出对应的url的图片的缩略图
Bitmap bitmap = ViewUtils.getInstance().getSmallBitmap(url, 100, 100);//todo 这个大小需要变
//此时的路径还是在原来的DCIM下面 需要变过去
int index;
String folderName;
index = url.indexOf("DCIM");
if (index == -1){
index = url.indexOf("Pictures");
}
folderName = url.substring(0, index -1);
url.replace(folderName, Constants.DISK_THUMB_PATH + File.separator);
thumbBean.setUrl(url);
//url已经处理好了,那么将bitmap在本地创建出来
try {
FileOutputStream fos = new FileOutputStream(url);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
callBack.onFinish(thumbBean);
}
}
public interface CallBack {
void onFinish(ThumbBean thumbBean);
}
}
该类是为了实现即时加载本地图片,使用了线程池,每个需要显示的图片对应一个url,将url对应的图片保存在cache路径下,使用时直接使用即可