在上一节中,我们使用Handler、Thread/Runnable 、URL、HttpURLConnection等等来进行异步下载网络图片。

但是采用这种方式有一些缺点,如下:

  • 线程的开销较大,如果每个任务都要创建一个线程,那么程序的效率要低很多。
  • 线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
  • 另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。

    那么有没有比较更好好的实现方式呢?这个可以有!它就是AsyncTask

    AsyncTask的特点是任务在主UI线程之外运行,而回调方法是在主UI线程中,这就有效地避免了使用Handler带来的麻烦。

    AsyncTask定义了三种泛型类型 Params,Progress和Result。
    • Params 启动任务执行的输入参数。
    • Progress 后台任务执行的百分比。
    • Result 后台执行任务返回的结果。

    当然,使用它还必须覆盖它的一些抽象方法方法

     doInBackground(Params...)        执行任务

     onPostExecute(Result)             返回任务执行的结果,通常更新UI

    onProgressUpdate (Progress... values) 进度更新

    注意:红色的是必须实现的。

    第一步:设计好UI,与上节一样

    第二步:也与上节一样。

    第三步:主要是实例化AsyncTask,并执行execute(Params)

    我们必须继承AsyncTask,并覆盖它的一些方法,我们这里主要是要获取网络图片,并保存为Bitmap,以便UI根据Bitmap来更新的。

    那么需要为AsyncTask设置返回的类型参数为String,Integer,Bitmap 类定义如下:

    View Code

    public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> {

    doInBackground(Params...)  方法中 ,接受String ....params,返回我们需要的Bitmap.当然我们这里是获取图片Bitmap所以要返回Bitmap

      如果你返回的需要是String或者其他复杂类型时候,需要修改类的定义参数类型为你需要返回的类型,当然接受参数也是根据你的请求需要改变。

    View Code

    @Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap=null;try {URL url = new URL(params[0]);HttpURLConnection con=(HttpURLConnection) url.openConnection();con.setDoInput(true);con.connect();InputStream inputStream=con.getInputStream();bitmap=BitmapFactory.decodeStream(inputStream); inputStream.close();} catch (MalformedURLException e) {e.printStackTrace();}catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();} return bitmap;}

     onPostExecute(Result) 中是请求获得结果后更新UI部分。你会看到他的参数就是我们类中的类型参数。代码如下:

    View Code

    //执行获得图片数据后,更新UI:显示图片,隐藏进度条 @Overrideprotected void onPostExecute(Bitmap Result){ImageView imgView=(ImageView)this.viewGroup.getChildAt(0);imgView.setImageBitmap(Result);ProgressBar bar=(ProgressBar)this.viewGroup.getChildAt(1);bar.setVisibility(View.GONE);}

    然后怎么用呢?在UI线程中执行吧:

    MyASyncTask yncTask=new MyASyncTask(this,frameLayout);
       yncTask.execute(params);

    运行结果与上节大同小异

    

Android异步下载网络图片(其二:AsyncTask)相关推荐

  1. Android异步下载网络图片(其三:ExecutorService)

    在第一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片.然后第二节中换了AsyncTask方式.那么这一节我们再应用 ...

  2. Android异步下载网络图片(其一:Handler)

    项目中有时候需要获取网络上的图片,并下载下来到手机客户端显示.怎么做呢? 实现思路是: 1:在UI线程中启动一个线程,让这个线程去下载图片. 2:图片完成下载后发送一个消息去通知UI线程 2:UI线程 ...

  3. IOS开发基础之异步下载网络图片第1部分

    IOS开发基础之异步下载网络图片第1部分 加入ATS // LJAppInfo.h // 37-异步下载网络图片 // Created by 鲁军 on 2021/3/10. #import < ...

  4. Android开发-下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...

  5. Android异步下载

    概述 实现App常见下载公共 支持通知栏显示 支持 暂停.取消功能,使用Service.AsyncTask实现异步下载.特点简单.实用.方便源码扩展修改 详细 代码下载:http://www.demo ...

  6. linux异步实现原理,Android异步处理四:AsyncTask的实现原理

    分析: 在分析实现流程之前,我们先了解一下AsyncTask有哪些成员变量. privatestaticfinalintCORE_POOL_SIZE =5;//5个核心工作线程 privatestat ...

  7. android 设置系统壁纸,Android HttpURLConnection下载网络图片设置系统壁纸

    需求: 壁纸是url链接,get就能请求到,所以就用get请求到图片,把图片转化为bitmap,然后设置壁纸. 代码: 这里我封装了工具类 package xxxxx.utils; import an ...

  8. Android HttpURLConnection下载网络图片,设置系统壁纸

    需求: 壁纸是url链接,get就能请求到,所以就用get请求到图片,把图片转化为bitmap,然后设置壁纸. 代码: 这里我封装了工具类 package xxxxx.utils;import and ...

  9. Android 异步获取网络图片并处理图片Out Of Memory 内存溢出问题

    测试环境为Adnroid 2.1以上. 1:AndroidManifest.xml 权限配置: 添加互联网访问权限: <uses-permission android:name="an ...

最新文章

  1. 如何使用 Cockpit 管理你的树莓派
  2. R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend
  3. 英特尔AI芯片首次商用交货!推理性能3.7倍于英伟达T4,年贡献245亿涨250%
  4. webSocket使用心跳包实现断线重连
  5. Java NIO学习系列一:Buffer
  6. 【竞赛相关】南大化院博士刘子腾:跨专业如何做数据竞赛浅谈
  7. 使用action framework 实现order change时自动发送邮件
  8. 被面试官问的Android问题难倒了,面试必会
  9. MySql-Proxy之多路结果集归并
  10. Android Studio导入项目遇到的问题
  11. 轮播图高度自适应_干货!弘成教你写轮播图全自动适应封装代码
  12. linux系统电脑白屏,在Deepin Linux 15.7系统中换桌面后关机界面白屏的解决
  13. 分析dmp文件使用表空间_R语言使用贝叶斯层次模型进行空间数据分析
  14. Crypto.com APP上线The Graph(GRT)
  15. android p正式版一加6,一加6T出厂搭载Android P 将于11月5日发布tokyo hot n0727
  16. 通过ssh远程连接Ubuntu主机
  17. Drain基于固定深度解析树
  18. 求素数/质数 简单Java算法
  19. 熟悉又陌生的 k8s 字段:finalizers
  20. C生万物 | 操作符汇总大全【庖丁解牛,精细讲解】

热门文章

  1. 【Git】Git 版本管理 ( 补充提交版本 git commit --amend | 版本库提取文件 git checkout -- filename | 删除文件 git rm )
  2. 【C 语言】文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )
  3. 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )
  4. 【鸿蒙 HarmonyOS】UI 组件 ( 进度条 ProgressBar 和 RoundProgressBar 组件 )
  5. 【Visual Studio 2019】创建 导入 CMake 项目
  6. LiveGBS国标流媒体-摄像机网页低延时无插件直播实现
  7. 前方高能 | 容器化应用操作原来可以这样简单
  8. BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值
  9. PHPcms 系统简单使用
  10. 使用stsadm命令部署和激活webpart解决方案