欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图片的三级缓存

程序员文章站 2022-07-02 09:46:12
...
private ImageView mPic_iv;
private File file;
private static final int SUCCESS = 382;

Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case SUCCESS:
                mPic_iv.setImageBitmap((Bitmap)msg.obj);
                break ;
            default:
                break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPic_iv = (ImageView) findViewById(R.id.pic_iv);
}

/**
 * 通过点击事件,从文件中找图片加载,文件没有图片,从网络上找图片
 *
 * @param view
 */
public void click(View view) {
    final String spec = "";
    /**
     * SD卡的存储空间分为两种类型
     * 1.内部存储:文件权限:默认是私有的,不允许别的应用程序访问
     * 2.文件存储:应用程序可以把数据存到自己应用的文件夹里面    路径/data/data/包名/文件名,数据安全
     * 上下文.getFileDir()  ------>/data/data/包名/files/文件名    保存重要的配置信息
     * 上下文.getCacheDir() ------>/data/data/包名/cache/文件名      缓存目录
     */
 
    final File file = new File(getCacheDir(), getFileName(spec));
    boolean exists = file.exists();
    //判断图片在缓存中是否存在,如果存在,那么从缓存中读取
    if (exists) {

// 可以从本地中找到图片进行加载
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
mPic_iv.setImageBitmap(bitmap);
} else {//如果图片在缓存中不存在,那么我们从网络上下载,耗时操作,子线程
new Thread(){
public void run() {

                try {
                    //1.使用网址创建一个URL对象
                    URL url = new URL(spec);
                    //2.创建HTTPURLConnection对象
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    //3.设置对象请求方式
                    httpURLConnection.setRequestMethod("GET");
                    //4.设置连接超时时间
                    httpURLConnection.setConnectTimeout(8000);
                    //设置读取的超时时间,写入超时间
                    //发送请求建立连接
                    httpURLConnection.connect();
                    //获取状态码
                    int responseCode = httpURLConnection.getResponseCode();
                    if (responseCode == 200){
                        //拿到服务器返回的数据
                        InputStream inputStream = httpURLConnection.getInputStream();

                        //字节数组
                        byte[] bytes = new byte[1024];
                        //定义一个int变量
                        int length;
                        //把流变成我们的一个文件
                        FileOutputStream fileOutputStream = new FileOutputStream(file);
                        while ( (length =inputStream.read(bytes))  !=-1 ){
                            //输出流进行写入
                            fileOutputStream.write(bytes,0,length);
                        }
                        //关流
                        fileOutputStream.close();

                        //可以从本地中找到图片进行加载
                        Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

                        Message message = new Message();

                        message.obj =bitmap;
                        message.what=SUCCESS;
                        handler.sendMessage(message);
                    }else {

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            };
        }.start();
    }
}

/**
 * http://169.254.53.96:8080/c.jpg
 * 从网址的字符串里拿到需要的文件名
 *
 * @param spec
 * @return
 */
private String getFileName(String spec) {
    //找到"/"所在字符串的位置
    int i = spec.lastIndexOf("/");
    System.out.println(i + "");
    String s = spec.substring(i + 1);
    return s;
}