在非UI线程中处理Bitmap
译文出自谷歌安卓官网
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相关推荐
- Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片
原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bi ...
- 在非UI线程中显示Toast
Toast的显示依赖于当前线程中的Handler,而Handler的创建必须有Looper,在UI线程中,系统自动为我们创建了Looper对象.因而在子线程中,我们必须手动的去创建Looper对象. ...
- android 组件 线程,Android UI线程和非UI线程
UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...
- Android UI线程和非UI线程
UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...
- 5.UI线程和非UI线程的交互方式
转载请标明出处: http://blog.csdn.net/yujun411522/article/details/46041637 本文出自:[yujun411522的博客] 这里说的交互方式应该 ...
- 非UI线程下页面处理:view的postInvalidate和post对消息处理的差异化
目录 前言 1.postInvalidate 2.post 3.总结 前言 我们知道view有一系列post方法,用于在非UI线程中发出一些页面处理.view还有另外一个postInvalidate方 ...
- android中多线程与ui,Android UI线程和非UI线程
UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程. 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件发生交互. 所以主 ...
- Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面
概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程.而由于Andr ...
- Android开发之UI线程和非UI线程
这里又是老生畅谈的话了,前边已经有多篇文章针对线程进行探究解释,Android开发过程中线程的体现更是淋漓尽致.Android开发过程中涉及到的线程从大类上分可以归为两类:UI线程和非UI线程.本篇就 ...
最新文章
- 【CyberSecurityLearning 74】DC系列之DC-5渗透测试
- truncate、rename函数的使用
- redhat6.5手动配置网络
- potato什么软件_曝光:诈骗数十亿的“张鹏”再出新项目美生在线,诈骗犯都这么努力,你还有什么资格不努力!?...
- 64位装32位oracle软件,在64位linux下安装32位oracle软件
- 解决windows 2003 无法安装vss2005的问题
- STM32单片机简介
- mysql 定时备份和远程备份脚本
- win7 微信 代理服务器设置,手把手为你讲解win7系统电脑登录多个微信的详细方法...
- IDEA git 切换分支产生问题
- java中的StringBuffer类
- 自定义AXI外设IP核实现流水灯
- 上传图片保存到mysql数据库并在网页上显示
- limt mysql操作
- asp.net 微信jsapi支付
- 怎么看自己的maven本地仓库在那里
- 新版本jdk(9、11、12、13、14)特性
- 谷歌地球和谷歌地图区别
- 服务器能当电脑用吗?与普通电脑有何区别?
- 基于php校园失物招领,基于全景图的校园失物招领系统
热门文章
- BigDecimal源码解析
- Vue.js 计算属性和侦听器
- 《JAVA与模式》之装饰模式
- 积跬步,聚小流------html知识大纲归纳总结
- 快速失败Vs安全失败(Java迭代器附示例)
- Java代码规范、格式化和checkstyle检查配置文档
- 论文Very Deep Convolutional Networks for Large-Scale Image Recognition
- Shell教程(四):条件语句、循环语句、break/continue
- ASP.NET 4.0 的新特性(2 在WebForm中使用Routing)(翻译)
- php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式