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

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值