安卓之下载图片显示到对应控件

135 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

在安卓app中 总会有图片显示在对应控件上

就像下图的头像一样 而这个的实现是通过从服务端下载图片 然后绑定到图片上

具体是怎么实现的 下面就教你如何做到

image.png

代码如下 :

我习惯先贴代码 没代码 说多了也没用

代码是最好的学习

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"));