本文已参与「新人创作礼」活动,一起开启掘金创作之路
在安卓app中 总会有图片显示在对应控件上
就像下图的头像一样 而这个的实现是通过从服务端下载图片 然后绑定到图片上
具体是怎么实现的 下面就教你如何做到
代码如下 :
我习惯先贴代码 没代码 说多了也没用
代码是最好的学习
package com.example.light;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 根据图片url路径获取图片
*
* @author zah
*
*/
public class GetImageByUrl {
private PicHandler pic_hdl;
private ImageView imgView;
private String url;
/**
* 通过图片url路径获取图片并显示到对应控件上
*
* @param imgView
* @param url
*/
public void setImage(ImageView imgView, String url) {
this.url = url;
this.imgView = imgView;
pic_hdl = new PicHandler();
Thread t = new LoadPicThread();
t.start();
}
class LoadPicThread extends Thread {
@Override
public void run() {
Bitmap img = getUrlImage(url);
//下面这行是查看下载是否成功
System.out.println(img + "---");
Message msg = pic_hdl.obtainMessage();
msg.what = 0;
msg.obj = img;
pic_hdl.sendMessage(msg);
}
}
class PicHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Bitmap myimg = (Bitmap) msg.obj;
imgView.setImageBitmap(myimg);
}
}
public Bitmap getUrlImage(String url) {
Bitmap img = null;
try {
URL picurl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) picurl
.openConnection();
conn.setConnectTimeout(6000);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.connect();
InputStream is = conn.getInputStream();
img = BitmapFactory.decodeStream(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return img;
}
}
首先我们需要一个显示控件来放图片 这个没问题吧
然后和一个图片下载url
最后是一个图片处理handler(这个主要是用来传递消息和通知主线程更新UI)
这个方法我们首先是需要这个getUrlImage方法去下载图片 具体的安卓图片下载我在其它的文章中有写 这里就不用详细介绍了
其中重要的是 img = BitmapFactory.decodeStream(is); 通过这个图片工程类的decodeStream方法 把下载的输入流给转换成图片
然后我们需要写一个方法让图片处理handler去发送消息
然后再创建一个线程去执行下载图片 和下载好之后通过图片处理handler去打开消息传递通道并把图片消息传递出去通知UI更新
这就是这个方法的基本流程
而怎么调用也很简单
就是给这个方法传递两个参数
public void setImage(ImageView imgView, String url)
一个是图片显示控件 一个是图片下载地址
GetImageByUrl getImageByUrl = new GetImageByUrl();
getImageByUrl.setImage(holder.url, list22.get(position).get("goodurl"));