1.创建工具类
public final class HttpTool {
private HttpTool(){}
public static byte[] doGet(String url){
byte[] ret = null;
if (url != null) {
HttpURLConnection conn = null;
try {
URL u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.connect();
int code = conn.getResponseCode();
if(code == HttpURLConnection.HTTP_OK){
InputStream stream = conn.getInputStream();
// Accept-Encoding 代表能够接受服务器传过来的压缩内容
String encoding = conn.getContentEncoding();
if("gzip".equals(encoding)){
// 解压缩
stream = new GZIPInputStream(stream);
}
ret = StreamUtil.readStream(stream);
StreamUtil.close(stream);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
StreamUtil.close(conn);
}
}
return ret;
}
}
2.创建字节流工具类
public final class StreamUtil {
private StreamUtil(){}
public static void close(Object stream){
if (stream != null) {
try {
if (stream instanceof Closeable) {
((Closeable) stream).close();
}else if(stream instanceof HttpURLConnection){
((HttpURLConnection) stream).disconnect();
}
}catch (IOException ex){
ex.printStackTrace();
}
}
}
public static byte[] readStream(InputStream in){
byte[] ret = null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
readStream(in, out);
ret = out.toByteArray();
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
public static long readStream(InputStream in, OutputStream out){
long ret = 0;
if (in != null && out != null) {
byte[] buf = new byte[1024];
int len;
try {
while (true) {
len = in.read(buf);
if (len == -1) {
break;
}
out.write(buf, 0, len);
ret += len;
}
}catch (IOException ioe){
ioe.printStackTrace();
}
}
return ret;
}
}
3.创建图片加载器
public class ImageTask extends AsyncTask<String, Integer, Bitmap> {
private SoftReference<ImageView> mReference;
private Context mContext;
public ImageTask(ImageView imageView){
mReference = new SoftReference<ImageView>(imageView);
mContext = imageView.getContext();
}
@Override
protected Bitmap doInBackground(String... strings) {
Bitmap ret = null;
if(strings != null && strings.length > 0){
String url = strings[0];
/
// 检查缓存,如果文件存在,直接形成图片
// 先检查文件缓存
// TODO: 将图片的数据保存到手机的内部存储区中,以文件的形式
// Context getFilesDir() 获取内部存储区 /data/data/包名/files
// getCacheDir() 缓存目录,当手机内部存储满了,那么系统自动删除这个目录
File cacheDir = mContext.getExternalCacheDir();
// 缓存目录需要监测,是否存在,不存在创建
if(cacheDir == null){
cacheDir = mContext.getCacheDir();
}
if(!cacheDir.exists()){
cacheDir.mkdirs();
}
File picFile = new File(cacheDir, EncryptUtil.mapUrl(url));
if(picFile.exists()){
ret = BitmapFactory.decodeFile(picFile.getAbsolutePath());
}else {
// 文件不存在的情况
// 联网下载图片
byte[] data = HttpTool.doGet(url);
if (data != null) {
// https://www.baidu.com/img/bd_logo1.png -> File
// http://www.sina.com.cn/img/bd_logo1.png
// String -> MD5 -> Hex
// 图片创建
ret = BitmapFactory.decodeByteArray(data, 0, data.length);
// TODO: 将图片的数据保存到手机的内部存储区中,以文件的形式
// Context getFilesDir() 获取内部存储区 /data/data/包名/files
// getCacheDir() 缓存目录,当手机内部存储满了,那么系统自动删除这个目录
//File cacheDir = mContext.getCacheDir();
// 缓存目录需要监测,是否存在,不存在创建
//
//if(!cacheDir.exists()){
// cacheDir.mkdirs();
//}
File saveFile = new File(cacheDir, EncryptUtil.mapUrl(url));
FileOutputStream fout = null;
try {
fout = new FileOutputStream(saveFile);
fout.write(data);
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
StreamUtil.close(fout);
}
data = null;
}
}
}
return ret;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
if(mReference != null){
ImageView imageView = mReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
}
4.创建加密工具,为了解决不同的网站下载到文件名字相同的图片
public final class EncryptUtil {
private EncryptUtil(){}
public static String mapUrl(String url){
String ret = null;
if(url != null){
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] data = digest.digest(url.getBytes());
// byte[] -> String HEX
StringBuilder sb = new StringBuilder();
for (byte b : data) {
// byte -> 2个 十六进制表示
sb.append(String.format("%2x", b));
}
ret = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return ret;
}
}