译文出自谷歌安卓官网

BitmapFactory.decode*方法不能在UI线程中执行。因为加载这些图片所花费的时间是不可预知的,取决于各种各样的因素(从磁盘或网络上的加载速度,图片的大小,CPU的性能等等)。如果图片加载任务阻塞了UI线程,系统会为你的应用程序标记一个ANR,并且你可以选择关闭你的应用程序。

本课程引导你进入使用AsyncTask作为背景线程来处理图片加载任务,并且向你展示如何处理并发问题

使用AsyncTask

这个AsyncTask类提供了一个背景执行工作和将执行结果发布到UI线程中。要想使用AsyncTask,你得创建一个基类并重写其方法。

如下使用AsyncTask将图片加载到ImageView中,并且使用了decodeSampledBitmapFromResource()的例子

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {private final WeakReference<ImageView> imageViewReference;private int data = 0;public BitmapWorkerTask(ImageView imageView) {// Use a WeakReference to ensure the ImageView can be garbage collectedimageViewReference = new WeakReference<ImageView>(imageView);}// Decode image in background.@Overrideprotected Bitmap doInBackground(Integer... params) {data = params[0];return decodeSampledBitmapFromResource(getResources(), data, 100, 100));}// Once complete, see if ImageView is still around and set bitmap.@Overrideprotected void onPostExecute(Bitmap bitmap) {if (imageViewReference != null && bitmap != null) {final ImageView imageView = imageViewReference.get();if (imageView != null) {imageView.setImageBitmap(bitmap);}}}
}

这个对ImageView的WeakReference确保AsyncTask不会阻碍ImageView被GC回收。当任务结束的时候,无法保证ImageView仍然在当前任务中,因此在onPostExecute( )中你必须检查ImageView的索引。例如,当用户从这个界面离开或者任务结束前配置发生了改变,这些会导致ImageView不存在,

开始异步加载Bitmap,并执行它

public void loadBitmap(int resId, ImageView imageView) {BitmapWorkerTask task = new BitmapWorkerTask(imageView);task.execute(resId);
}

在非UI线程中处理Bitmap相关推荐

  1. Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片

    原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bi ...

  2. 在非UI线程中显示Toast

    Toast的显示依赖于当前线程中的Handler,而Handler的创建必须有Looper,在UI线程中,系统自动为我们创建了Looper对象.因而在子线程中,我们必须手动的去创建Looper对象. ...

  3. android 组件 线程,Android UI线程和非UI线程

    UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...

  4. Android UI线程和非UI线程

    UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...

  5. 5.UI线程和非UI线程的交互方式

    转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46041637 本文出自:[yujun411522的博客] 这里说的交互方式应该 ...

  6. 非UI线程下页面处理:view的postInvalidate和post对消息处理的差异化

    目录 前言 1.postInvalidate 2.post 3.总结 前言 我们知道view有一系列post方法,用于在非UI线程中发出一些页面处理.view还有另外一个postInvalidate方 ...

  7. android中多线程与ui,Android UI线程和非UI线程

    UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程. 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件发生交互. 所以主 ...

  8. Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面

    概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程.而由于Andr ...

  9. Android开发之UI线程和非UI线程

    这里又是老生畅谈的话了,前边已经有多篇文章针对线程进行探究解释,Android开发过程中线程的体现更是淋漓尽致.Android开发过程中涉及到的线程从大类上分可以归为两类:UI线程和非UI线程.本篇就 ...

最新文章

  1. 【CyberSecurityLearning 74】DC系列之DC-5渗透测试
  2. truncate、rename函数的使用
  3. redhat6.5手动配置网络
  4. potato什么软件_曝光:诈骗数十亿的“张鹏”再出新项目美生在线,诈骗犯都这么努力,你还有什么资格不努力!?...
  5. 64位装32位oracle软件,在64位linux下安装32位oracle软件
  6. 解决windows 2003 无法安装vss2005的问题
  7. STM32单片机简介
  8. mysql 定时备份和远程备份脚本
  9. win7 微信 代理服务器设置,手把手为你讲解win7系统电脑登录多个微信的详细方法...
  10. IDEA git 切换分支产生问题
  11. java中的StringBuffer类
  12. 自定义AXI外设IP核实现流水灯
  13. 上传图片保存到mysql数据库并在网页上显示
  14. limt mysql操作
  15. asp.net 微信jsapi支付
  16. 怎么看自己的maven本地仓库在那里
  17. 新版本jdk(9、11、12、13、14)特性
  18. 谷歌地球和谷歌地图区别
  19. 服务器能当电脑用吗?与普通电脑有何区别?
  20. 基于php校园失物招领,基于全景图的校园失物招领系统

热门文章

  1. BigDecimal源码解析
  2. Vue.js 计算属性和侦听器
  3. 《JAVA与模式》之装饰模式
  4. 积跬步,聚小流------html知识大纲归纳总结
  5. 快速失败Vs安全失败(Java迭代器附示例)
  6. Java代码规范、格式化和checkstyle检查配置文档
  7. 论文Very Deep Convolutional Networks for Large-Scale Image Recognition
  8. Shell教程(四):条件语句、循环语句、break/continue
  9. ASP.NET 4.0 的新特性(2 在WebForm中使用Routing)(翻译)
  10. php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式