HttpURLConnection获取网络读片,读取本地缓存图片

今天在写一篇关于Download图片

直接代码,本人用的自己搭建的服务器(tomcat), 大家可以换成自己想下载图片的路径,存放到缓存路径下,下次在读的时候就可以直接在本地读取

package com.hexl.dowloadimg;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private static ImageView iv;
    private static final String PATH = "http://172.16.3.2:8080/tomcat.png";

    //如果不用 static 修饰的话会报警告,是因为 Handler 如果不静态会容易导致内存泄漏
    static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //更新 UI
            iv.setImageBitmap((Bitmap) msg.obj);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定控件
        btn = (Button) findViewById(R.id.btn);
        iv = (ImageView) findViewById(R.id.iv);
        btn.setOnClickListener(new View.OnClickListener() {

            private File file;

            @Override
            public void onClick(View v) {//点击监听事件
                //判断本地缓存里是否有图片,没有的话就从网络下载否则从本地读取
                //将流文件放到缓存路径下面
                file = new File(getCacheDir(), getPath(PATH));
                if (file.exists()) {
                    Log.d("MainActivity", "在缓存里");
                    Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
                    iv.setImageBitmap(bm);
                } else {
                    Log.d("MainActivity", "从网络下载");
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                URL url = new URL(PATH);
                                //打开连接
                                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                                //设置请求方式为: GET
                                conn.setRequestMethod("GET");
                                //设置连接超时
                                conn.setConnectTimeout(5000);
                                conn.setReadTimeout(5000);
                                //发送请求与服务器建立连接
                                conn.connect();
                                if (conn.getResponseCode() == 200) {//200为成功
                                    InputStream is = conn.getInputStream();
                                    //获取输出流
                                    FileOutputStream fos = new FileOutputStream(file);
                                    byte[] b = new byte[1024];
                                    int len = 0;
                                    //判断只要!=-1就证明还有数据没有读完
                                    while ((len = is.read(b)) != -1) {
                                        fos.write(b, 0, len);
                                    }
                                    //读流文件,如果还用下面的那个方法会报空指针
                                    Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                                    //读流文件
//                                Bitmap bitmap = BitmapFactory.decodeStream(is);
                                    //获取 Message 对象 通过这种方式而不是直接去 new 的方法去创建.
                                    //这个方法会去判断线程池里是否有 Message 对象,如果为null 的话才会new 下面是源码
                                    /**
                                     * public static Message obtain() {
                                     synchronized (sPoolSync) {
                                     if (sPool != null) {
                                     Message m = sPool;
                                     sPool = m.next;
                                     m.next = null;
                                     m.flags = 0; // clear in-use flag
                                     sPoolSize--;
                                     return m;
                                     }
                                     }
                                     return new Message();
                                     }
                                     */
                                    Message m = handler.obtainMessage();
                                    m.obj = bitmap;
                                    //发送消息
                                    handler.sendMessage(m);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                }
            }
        });

    }

    /**
     * @param path 路径
     * @return 截取后的name
     */
    public String getPath(String path) {
        int index = path.lastIndexOf("/");
        return path.substring(index + 1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值