安卓半成品-ImageView 如何加载网络图片

作者:vkvi 来源:ITPOW(原创) 日期:2018-4-18

别看安卓三天两头都在推新版本,才几年功夫都 8.0 了。可是安卓中的控件半成品一大堆一大堆的,屁大点事都要开发人员操心。

今天要说的这个半成品就是 ImageView 如何加载网络图片。

原理

就是我们自己用 HTTP 去将图片流 download 下来,然后赋给 ImageView。

具体代码可以参见:Android在ImageView上直接显示网络图片。

本文主要说的是坑

一、不要在子线程中更新界面。

安卓规定 Http 请求必须放在异步中,而界面更新必须是在主线程中。所以上面示例文章使用了 Handler 通知主线程更新图片。当然我们也可以用其他的方式,比如:runOnUiThread。具体可参见:快速切换到主线程更新UI的几种方法

二、在我们重载的控件中应该设置一个属性,用以存储当前 URL,比如叫 m_url,并在 Http 请求之前,判断请求的 URL 和 m_url 是否一致

为什么这样做呢?目的是每次发起 Http 请求之前,判断请求的 URL 和 m_url  是否一致,如果一致就不要重复请求了。

要知道,如果 ImageView 放在 ListView 中,随便一滑动,都会触发 ImageView 重新加载。

三、在 Http 请求完成后,要判断请求的 URL 和 m_url 是否一致

如果不一致,就抛弃 Http 下来的数据流。因为我们可能两次为 ImageView 设置了 url,如果第一次 Http 速度慢,第二次 Http 速度快,那么最终结果为显示第一次的图片,这显然不是我们想要的,所以设置一个判断。

四、图片要缓存起来。

缓存起来,以后就用 setImageBitmap(BitmapFactory.decodeFile(cacheFilePath));。

如果不缓存,特别是针对放在 ListView 中的 ImageView,随便一滑动 ListView,又是再次请求,耗流量都是小事,每次都卡得要死。

相关文章