android网络连接之下载图片

本文介绍了一种在Android开发中利用Handler机制实现子线程下载图片并更新主线程UI的方法。通过创建Handler对象处理子线程传递的消息,实现图片加载和显示的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//网络请求操作耗时,一般不要放在主线程中,否则主线程阻塞,UI停止刷新
//应用无法响应用户操作,主线程又称为UI线程,只有在主线程中才能刷新UI
消息队列机制
主线程创建时,系统会同时创建消息队列对象(MessageQueue)和消息轮询器对象
(Looper)
轮询器的作用:就是不停的检测消息队列中是否有(Message)
消息队列一旦有消息,轮询器会把消息对象传给消息处理器(Handler),处理器
会调用handlerMessage方法来处理这条消息,handlerMessage方法会运行在
主线程中,所以可以刷新UI,只要消息队列有消息,handlerMessage就会调用
子线程如果需要刷新UI,只需要往消息队列发送一条消息即可。
子线程使用处理器对象的sendMessage()方法发送消息。
Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        ImageView iv = (ImageView) findViewById(R.id.iv);
        iv.setImageBitmap((Bitmap) msg.obj);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main3);
}

public void dianji(View view) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            //图片的网址
            String path = "http://localhost:8999/72.jpg";
            try {
                //把网址封装成一个url对象
                URL url = new URL(path);
                //获取客户端和服务器的连接对象,这时候还没有建立起连接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                //对连接对象进行初始化
                //设置请求方法,注意大写
                conn.setRequestMethod("GET");
                //设置连接超时
                //conn.setConnectTimeout(5000);
                //设置读取超时
                //conn.setReadTimeout(5000);
                //发送请求与服务器进行连接
                conn.connect();
                //获取响应码
                if (conn.getResponseCode() == 200) {
                    //请求成功
                    //获取服务器响应头中的流,流里的数据就是客户端请求的数据
                    InputStream is = conn.getInputStream();
                    //读取出流里的数据并形成图片
                    Bitmap bitmap = BitmapFactory.decodeStream(is);
                    Message message = new Message();
                    message.obj = bitmap;
                    handler.sendMessage(message);
                } else {
                    Toast.makeText(getApplicationContext(), "请求失败", Toast.LENGTH_SHORT).show();
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
    t.start();
}
//不要忘记加入网络权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值