今天在写一篇关于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); } }