android显示网络图片控件,Android控件之ImageView(二)

前言

在上一篇文章中,我们讲解了如何加载本地图片,那么在实际项目中 ImageView 大多数使用场景是加载网络图片,网络图片其实就是存储在服务器上的文件,我们需要从服务器获取到文件的二进制输入流 Inpustream ,然后将其转化为 ImageView 可以加载的 Bitmap 对象。实现网络图片的加载。

这篇文章我们通过使用原始的网络连接和使用第三库来简单讲解 ImageView 网络图片的加载。

怎么使用原始方式加载网络图片?

第三方网络图片加载库与原始加载库的对比?

怎样使用第三方网络加载库加载图片?

使用原始方式加载网络图片

先上代码(主要分为三大步骤):

1~6 : 从网络获取图片。由于Android 系统规定网络请求操作需要在子线程完成。主要是因为网络请求属于耗时操作,如果在主线程发起网络请求会导致主线程在网络请求期间,无法及时响应用户的操作,

7:利用在 Activity声明的 Handler对象把在子线从网络获取到的 Bitmap 对象,转移到 UI 线程。

8 : 更新UI。

public class ImageNetActivity extends AppCompatActivity {

/**

* 7.要知道 这里现在是子线程 更新UI的操作需要在主线程(UI线程)完成。

* 在 Activity 中声明 Handler 对象,并复写它的 handleMessage 方法

*/

private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 1010) {

Bitmap bitmap = (Bitmap) msg.obj;

setImageView(bitmap);

}

}

};

private ImageView mImageView;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_image_net);

mImageView = findViewById(R.id.image);

loadImageUrl("https://cdn.pixabay.com/photo/2017/05/09/23/02/dog-2299482_960_720.jpg");

}

private void loadImageUrl(final String imageUrl) {

// Android 系统强制网络请求需要在子线程操作

new Thread(new Runnable() {

@Override

public void run() {

InputStream inputStream = null;

try {

// 1. 把传过来的路径转成URL

URL url = new URL(imageUrl);

// 2.通过URL 建立网络连接

// --> url.openConnection() 返回 URLConnection

// ,它是一个抽象类,这里需要通过Http协议建立连接,需要它的实现类 HttpURLConnection

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

// 3. 使用GET方法访问网络

urlConnection.setRequestMethod("GET");

// 配置网络超时时间为 10秒

urlConnection.setConnectTimeout(10000);

//4. 获取Http协议 响应码

int responseCode = urlConnection.getResponseCode();

// Http 协议 规定 响应码为200时 请求成功

if (responseCode == 200) {

// 5. 得知 请求资源成功后,获取图片文件输入流

inputStream = urlConnection.getInputStream();

// 6. 把获取到的 文件输入流 通过 系统Api 转换为 ImageView 可以识别的 Bitmap 对象

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

// 7.要知道 这里现在是子线程 更新UI的操作需要再主线程(UI线程)完成。

Message message = mHandler.obtainMessage();

message.obj = bitmap;

message.what = 1010;//

mHandler.sendMessage(message);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (inputStream != null) {

try {

//关闭流

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}).start();

}

}

/**

* 8.利用从 Mesage 从子线程中携带回来的 Bitmap 对象,在UI线程设置图片

*/

private void setImageView(Bitmap bitmap) {

mImageView.setImageBitmap(bitmap);

}

}

上面是创建一个空的 Activity ,布局文件中只有一个 ImageView 控件。

注意:在 Android中 主线程 也叫 UI线程。UI 线程是响应用户操作的线程,一旦在 UI线程中存在好在操作,就会阻塞 UI 线程,导致无法及时响应用户操作事件。所以在Android 系统 4.0 后,强制网络请求操作必须在子线程。但问题是:所有更新 UI 的操作又必须在UI线程,这就是我们必须把网络请求的结果,转移到主线程才能更新 UI。怎么转移呢? 那就是 Handler。这个现在知道怎么用就行,后面我们会仔细讲解。

上面的代码中,利用系统自带 ULRConnection请求网络请求的步骤注释已经很详细了。可仔细了解其网络请求步骤,大致的套路是一样的。

特别特别特别注意:网络请求是需要权限的,你需要在 AndroidManifet.xml 文件中声明一句用户权限。至于权限的概念后面我们会细聊。现在只需要在AndroidManifet.xml文件申明即可。

第三方网络图片加载库与原始加载库的对比

我们来思考几个问题,如果在真实项目中,我们这样加载图片你觉得可以吗?

........

答案是:不可以。

问题1:上面就只单一使用了内存缓存来解决图片加载问题,Android 系统为每个应用分配的内存是有限的,假如说我们的图片成千上万,即使现在的 Android 手机硬件都配置很高,也顶不住这样的操作,当内存不足时应用马上会崩溃(Crash)。

问题2:内存缓存,易失去性。即当你重新启动应用程序后,原来已经加载过的图片就会丢失,重启后又会重新下载!这就会导致页面加载缓慢,再次耗费用户流量。

所以我们需要一个比较完善的图片加载系统,这个系统最基础的要包括图片的缓存策略:先从网络请求图片,在手机内存中和SD卡中各自保存一份图片资源。当重启应用时,如果图片存在SD卡中,就可以从SD卡中直接获取图片加载。并且SD卡所能存储的图片总数是一定的,会不断的根据策略去舍去图片的存留。

还有非常重要的一点:从图片加载库的使用者角度讲,使用者无需关心内部到底是使用内存缓存,还是SD卡缓存,或是直接从网络获取的。这对于使用者来讲,内部的一切用户并不需要知道。使用者只需要知道加载图片的接口。

对于图片加载框架,内部实现是极其复杂的,目前我们并不需要了解其内部实现方式。

下面我们就使用最常用的图片加载框架 Glide来完成我们图片加载框架使用的演示。

怎样使用第三方网络加载库加载图片(Glide)

我们要知道,因为Android是开源的,所以会产生各种各样的第三方框架,而我们不能盲目的去使用,要根据实际情况,从这之中挑选出最优的、最适合自己项目的框架,合理有效的去使用各种资源。而我们推荐的Glide是经过不断的和其他框架对比所挑选出来性价比最高的!

目前国内主流的第三方网络图片加载库有Glide(主推)、ImageLoader、Picasso、Volley、Fresco等,感兴趣的小伙伴可以去搜索一下这些加载库的全方面对比,百度一哈比比皆是,我们就不再这里将网上的一些大神所对比的实际内容再复述一遍啦。下面请跟我走4步,完成你人生中第一次加载网络图片吧!!!

首先我们要通过依赖 Glide 图片加载库。

在官方文档中我们找到需要依赖的 Glide库地址。

implementation 'com.github.bumptech.glide:glide:4.9.0'

将依赖地址放置到 app 模块下的 build.gradle 中如图:

1460000020121368?w=1163&h=637

添加完成后,我们点击 右上角的 Sync Now ,从网络下载依赖库到本地,并依赖到 app 模块。

我们在创建的空 Activity 当中,为 ImageView控件利用 Glide加载图片。

1460000020121369?w=1219&h=477

okay,搞定!!使用第三图片加载库是不是很简单。

其实里面的大致操作就是我们在第一个问题中书写的代码,里面多的就是各种缓存策略和逻辑处理。

结语

关于网络图片的加载我们今天就讲到这里,请原谅小编没有对Glide的源码做详解,因为内容过于复杂,涉及到很多初学者无法理解的知识,咱们目前只需要会使用,慢慢的跟着我们一起学习,后续这些都会融会贯通的~ 如果有小伙伴对Glide的源码感兴趣可以加入我们的微信群一起探讨~ 在公众号中回复微信群,就可以加入其中,也可以在公众号中回复视频,里面有一些初学者视频哦~

PS:如果还有未看懂的小伙伴,欢迎加入我们的QQ技术交流群:892271582,里面有各种大神回答小伙伴们遇到的问题,我们的微信群马上也将要和大家见面啦,届时希望大家踊跃加入其中~~

1460000020081817?w=560&h=309

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模

曲面流动可以建什么模型?这样的▼这样的▼还有这样的▼那究竟如何使用曲面流动呢?本文告诉你!曲面流动是什么?曲面流动功能相当于Rhino(犀牛)中的“沿曲面流动”命令,可以使来源几何体群组或组件,根据基准平面为参照,…

android o 结构光流程,惊艳亮相!一分钟看懂OPPO Find X 3D结构光技术是什么鬼,太牛了...

法国时间6月19日,OPPO在巴黎卢浮宫正式举办未来旗舰Find X发布会。此次亮相的Find X新机,既有充满艺术感的3D玻璃机身设计,又有3D结构光、曲面全景屏、双轨潜望结构等多项黑科技。众多黑科技中,以3D结构光O-face最受数目。据悉&am…

jframe运行和预览大小不一样_同一款车型,为什么配的轮胎大小还会不一样?【内含福利】...

小编又来给大家送福利啦~阅读完文章之后 戳文章底部阅读原文 岁末巨献 国货好胎!免费体验价值1999元国产轮胎!相信有不少朋友,买车的时候一定会有类似的经历。选车、试驾的时候,看到试驾车配置相当漂亮,尤其搭配的轮圈…

java设计按月每天签到_活动攻略|新同学新签到,欢乐福利全都要!

12月03日【每日一题答案】— 枫叶书签答对问题即有机会获得金币、道具、积分,还有宠物好奇星噢~12月来了,和12月一起来的是我们的新同学——花轮!谁不喜欢浪漫体贴的小少爷呢!喵星星感觉自己爱消除【最受欢迎男性角色】的地位正岌…

bs cs架构区别_软件架构设计分层模型和构图思考

今天谈下架构设计中的分层思维和分层模型以及基于分层思维下的架构构图逻辑。架构思维概述对于架构思维本身仍然是类似系统思维,结构化思维,编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁&…

pin码计算器网页版_AP微积分Excel简便计算+网页工具指南

今年的AP考试既然是开卷,允许大家使用各种资源。今天一个学生提了一个不(zhe)错(mo)的(wo)想(de)法(shi)。于是给大家写了一个Excel的公式表格照例老规矩:点个”在看“再走呗先说明一下使用指南:文末有下载表格包含:(目前的功能&a…

HTML文本下划线效果,聊聊CSS中文本下划线_CSS, SVG, masking, clip-path, 会员专栏, text-decoration 教程_W3cplus...

在Web中给文本添加下划线常常出现在链接的文本上,早期一般使用text-decoration属性给文本添加下划线、删除线等。除了text-decoration之外,CSS还有很多技术方案可以给文本添加下划线效果,比如border-bottom、box-shadow、background-image等。…

学员感言html效果图,学员感言丨非计算机专业学员 开始学HTML5的点点滴滴

学员感言丨非计算机专业学员 开始学HTML5的点点滴滴来源:奇酷教育 发表于:2017-08-03 12:09:25在奇酷学员学习HTML5的这段时间里,让我学习到了实用的技能和知识。我是一个非计算机类学生,可以说是对编程一窍不通,在选择…

请领导批阅文件怎么说_请领导吃饭,不要对外说,职场员工为何如此保密?

前一段时间公司员工晋升,因为小王在公司的表现非常不错,所以成为了公司领导的秘书。其实按理来说,成为公司领导的秘书与否,往往只需要看这个员工有没有眼力,看她的办事能力如何,能不能提高公司的整体效率&a…

幼儿使用计算机需要注意事项,儿童玩电脑注意事项

相信现在的家庭里面很多小孩子爱玩电脑,但是电脑玩多了,对孩子眼睛、身体都不好,那么应该怎么才能科学玩电脑呢?妈网百科给大家总结了一些其他家长的经验,希望能够帮得到各位有需要的家长。【与电脑保持距离】孩子与电…

c++实现卷积码编码和维特比译码_鑫艾勒维特家用别墅电梯:安全至上,无可替代...

近年来,随着房地产行业的兴起,家用别墅电梯作为房地产配套产业也逐渐走进了平常家庭别墅中,如今一句俗语“无梯不成墅”将电梯在别墅中的重要地位彰显的淋漓尽致。艾勒维特家用液压小电梯因其适用于私人住宅,适用场景多样等特点&a…

某个元素的距离页面的左边距_如何提高办公写作效率?先设置好页面上的这4类数据,准没错...

有人说,在体制内混的好,首先要文笔好。这里要说的是,一个文笔好的人,可能在哪里都能混的好。#直言职场#因为很多表达形式都需要以文字做雏形,进而进行各种形式的变换和转化。就拿当下很热门的自媒体行业来说&#xff0…

地线与接地螺丝_电气接地的规范要求及接地的各项参数,收藏!

申请加入微信群:加微信好友,diangong1968申请格式:城市-公司简称(电气工程师职称)点此去资料库下载本篇资料为了主要目的是保护人身和设备的安全,减少公司电气事故发生,控制公司人员和财产不受损失,所有电气…

ai怎么渐变颜色_Ai渐变插画怎么丰富细节

此次教程只需小伙伴对AI软件有基本的操作了解就可以完成,易上手容易理解。止疼药瓶子1.新建画布800X600,绘制止疼药瓶子轮廓用矩形工具(W)绘制止疼药瓶子轮廓,圆角处用直接选择工具(A)选择矩形2个锚点,拉成自己想要的圆角。2.给止…

axure8.0发布html,Axure 8.0 beta最后一批新增和改进功能的介绍

之前一直想翻译Axure官方博客的这篇介绍,但一直没抽出时间,今天偶然发现ShunzUX翻译了这篇文章。阅读后觉得翻译得很准确,特别转来分享给大家。特别是On-Premises Axure Share,我之前都是翻译成『本地部署Axure Share』&#xff0…

实现option上下移动_Django实战2-自动化运维之配置管理-05:字典管理功能实现

本节内容主要实现CMDB基础数据管理功能的实现,文档中会介绍到datatables后端分页实现和过滤查询功能的实现。在Django实战1中已经自定义了 添加、修改等自定义类视图,本节中可以直接使用。1、字典管理页面实现首先来实现字段管理的基础管理页面&#xff…

用计算机对话的小品,爆笑小品剧本台词《作弊记》

小品深入生活,贴近生活,体验生活,从生活中找灵感。要用艺术的眼光去发现题材,挖掘题材。人物: 学生甲 学生乙 监考教师(教室门前)(甲乙边走边聊,乙背着书包,甲两手空空,只在上衣贴胸…

python queue查询空_【Python】多线程爬虫案例

爬取博客园文章列表爬取博客园文章列表,假设页面的URL是https://www.cnblogs.com/loaderman 要求:使用requests获取页面信息,用XPath / re 做数据提取 获取每个博客里的标题,描述,链接地址,日期等保存到 js…

美国计算机科学联赛获奖,【竞赛获奖】西安高新一中国际班学子在2018-2019美国计算机科学联赛 (ACSL)积分赛中创造历史!...

西安高新一中国际班学子在2018-2019美国计算机科学联赛(ACSL)积分赛中创造历史2018-2019美国计算机科学联赛 (ACSL)积分赛喜讯传来!此次竞赛共有来自全国109所重点中学和国际学校的近500同学参赛。在此次竞赛中,中国赛区共有17名同学获得个人最高分奖&am…

5单个编译总会编译全部_JDBC【5】 JDBC预编译和拼接Sql对比

在jdbc中,有三种方式执行sql,分别是使用Statement(sql拼接),PreparedStatement(预编译),还有一种CallableStatement(存储过程),在这里我就不介绍CallableStatement了,我们来看看Statement与PreparedStateme…