您的位置:首页 > 理论基础 > 计算机网络

Android 异步加载网络图片并缓存到本地

2014-04-21 17:40 627 查看
在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片。

软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,如果下载后就存到本地,下次读取时首先查看本地有没有,如果没有再从网络读取。

记得2月份在和爱奇艺公司的项目总监一起搞联通的OTT盒子的时候他就提了一下软引用,奇艺做的手机客户端就是采用这种方法,所以你会发现奇艺客户端占用很大的空间,下面就分享一下异步加载网络图片的方法吧。

FileCache.java

[java] view plaincopy

import java.io.File;

import android.content.Context;

public class FileCache {

private File cacheDir;

public FileCache(Context context) {

// 找一个用来缓存图片的路径

if (android.os.Environment.getExternalStorageState().equals(

android.os.Environment.MEDIA_MOUNTED))

cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),

"文件夹名称");

else

cacheDir = context.getCacheDir();

if (!cacheDir.exists())

cacheDir.mkdirs();

}

public File getFile(String url) {

String filename = String.valueOf(url.hashCode());

File f = new File(cacheDir, filename);

return f;

}

public void clear() {

File[] files = cacheDir.listFiles();

if (files == null)

return;

for (File f : files)

f.delete();

}

}

HttpUtil.java

[java] view plaincopy

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.ProtocolException;

import java.net.URL;

import java.net.URLEncoder;

import java.util.Map;

/**

* Http 请求工具类

*

* @author Scorpio.Liu

*

*/

public class HttpUtil {

/**

* 获取响应字符串

*

* @param path

* 路径

* @param parameters

* 参数

* @return 响应字符串

*/

public static String getResponseStr(String path, Map<String, String> parameters) {

StringBuffer buffer = new StringBuffer();

URL url;

try {

if (parameters != null && !parameters.isEmpty()) {

for (Map.Entry<String, String> entry : parameters.entrySet()) {

// 完成转码操作

buffer.append(entry.getKey()).append("=")

.append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");

}

buffer.deleteCharAt(buffer.length() - 1);

}

url = new URL(path);

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setConnectTimeout(3000);

urlConnection.setRequestMethod("POST");

urlConnection.setDoInput(true);// 表示从服务器获取数据

urlConnection.setDoOutput(true);// 表示向服务器写数据

// 获得上传信息的字节大小以及长度

byte[] mydata = buffer.toString().getBytes();

// 表示设置请求体的类型是文本类型

urlConnection.setRequestProperty("Content-Type",

"application/x-www-form-urlencoded");

urlConnection.setRequestProperty("Content-Length", String.valueOf(mydata.length));

// 获得输出流,向服务器输出数据

OutputStream outputStream = urlConnection.getOutputStream();

outputStream.write(mydata, 0, mydata.length);

outputStream.close();

int responseCode = urlConnection.getResponseCode();

if (responseCode == 200) {

return changeInputStream(urlConnection.getInputStream());

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (ProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

private static String changeInputStream(InputStream inputStream) {

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

byte[] data = new byte[1024];

int len = 0;

String result = "";

if (inputStream != null) {

try {

while ((len = inputStream.read(data)) != -1) {

outputStream.write(data, 0, len);

}

result = new String(outputStream.toByteArray(), "UTF-8");

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

public static InputStream getInputStream(String path) {

URL url;

try {

url = new URL(path);

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setConnectTimeout(3000);

urlConnection.setRequestMethod("GET");

urlConnection.setDoInput(true);// 表示从服务器获取数据

urlConnection.connect();

if (urlConnection.getResponseCode() == 200)

return urlConnection.getInputStream();

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

public static byte[] readStream(InputStream inStream) throws Exception {

ByteArrayOutputStream outSteam = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = -1;

while ((len = inStream.read(buffer)) != -1) {

outSteam.write(buffer, 0, len);

}

outSteam.close();

inStream.close();

return outSteam.toByteArray();

}

public static void CopyStream(String url, File f) {

FileOutputStream fileOutputStream = null;

InputStream inputStream = null;

try {

inputStream = getInputStream(url);

byte[] data = new byte[1024];

int len = 0;

fileOutputStream = new FileOutputStream(f);

while ((len = inputStream.read(data)) != -1) {

fileOutputStream.write(data, 0, len);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (inputStream != null) {

try {

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fileOutputStream != null) {

try {

fileOutputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

请点击这个链接阅读详细介绍:http://g.csdn.net/5265982
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐