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

来源:互联网 发布:萌化软件 编辑:程序博客网 时间:2024/05/22 12:06
在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
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑提示安全设置不允许下载怎么办 微信和ipad同步怎么办 苹果6空间已满怎么办 苹果6内存虚满怎么办 监控主机密码忘了怎么办 加购物车不下单怎么办 绑定qq账号消息不见了怎么办 现在的注册微信怎么办 爱奇艺手机号码被别人绑定了怎么办 手机号码换了支付宝账号怎么办 qq换手机号了怎么办呢 公司被注销了公众号怎么办 qq号被限制查找怎么办 qq号别人查找不到怎么办 qq邮箱已被注册怎么办 微信付款没网络怎么办 天猫买的假货店铺关门了怎么办 鞋小了半码怎么办 迅雷会员种子不能加速怎么办 迅雷会员为什么不能加速怎么办 持有st创智股票怎么办 租的房子床坏了怎么办 宜家定时器不响怎么办 新插座插不进去怎么办 本溪人社app打不开怎么办 南宁电车超过上牌时间怎么办 苹果6s降频怎么办 0首付手机还不起怎么办 乐才app登录不上怎么办 买了笔记本网要怎么办? 电脑连接不上网络怎么办 电脑上没网络了怎么办 手机返回键不好使怎么办 笔记本无线网连接受限怎么办 魅族打电话图标没有了怎么办 京东价格保护后发票怎么办 淘宝未满十八岁怎么办 SVN提交时代码冲突怎么办 京东自营没货了怎么办 京东下了单 没货怎么办 万达广场购物卡怎么办