2019独角兽企业重金招聘Python工程师标准>>>

android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图事件,它同样是用户与 android 控件 交互的线程。比如,当你在屏幕上的 EditText 上输入文字, UI 线程会把这个事件分发给刚输入文字的 EditText ,紧接会向事件队列发送一个更新 ( invalidate )请求。 UI 线程会把这个请求移出事件队列并通知 EditText 在屏幕上重新绘制自身。

这种单线线程模型就会使得 android 的应用程序性能低下, 如果在这个单线程里执行一些耗时的操作, 比如访问数据库, 或是从网络端下载图片, 就会会阻塞整个用户界面。 比如如下操作:

Bitmap b =  loadImageFromNetwork();

EE

这个操作非常耗时, 在这种情况下你会发现 , 界面僵死在那里并且 android 在系统 5 秒中后没有反应,会显示一个关闭或等待的错误。

也许我们可以使用一个新的 Thread 来解决它

new Thread(new Runnable() {  public void run() {                         Bitmap b = loadImageFromNetwork();    mImageView.setImageBitmap( b );    }
}).start();

但这样会发生一些很难察觉的错误, 因为我们知道 UI 线程不是线程安全的。当然有很多种方法来处理这个问题:

android 提供了几种在其他线程中访问 UI 线程的方法。

• Activity.runOnUiThread( Runnable )
• View.post( Runnable )
• View.postDelayed( Runnable, long )
• Hanlder

new Thread( new Runnable() {    public void run() {    final Bitmap b = loadImageFromNetwork();    mImageView.post( new Runnable() {    mImageView.setImageBitmap( b );
});    }
}).start();

这种方法比较繁琐,同时当你需要实现一些很复杂的操作并需要频繁地更新UI 时这会变得更糟糕。为了解决这个问题,android 提供了一个工具类:AsyncTask ,它使创建需要与用户界面交互的长时间运行的任务变得更简单。

就拿加载网络图片举个例子:

ublic class CanvasImageTask extends AsyncTask<ImageView, Void, Bitmap>{private ImageView gView ;protected Bitmap doInBackground(ImageView... views) {Bitmap bmp = null ;ImageView view = views[0];// 根据iconUrl获取图片并渲染,iconUrl的url放在了view的tag中。if (view.getTag() != null) {try {URL url = new URL(view.getTag().toString());HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setDoInput(true);conn.connect();InputStream stream = conn.getInputStream();bmp = BitmapFactory.decodeStream(stream);stream.close();} catch (Exception e) {Log.v("img", e.getMessage());return null;}}this.gView = view;return bmp;}protected void onPostExecute(Bitmap bm) {if (bm != null) {this.gView.setImageBitmap(bm);this.gView = null ;}}}
在Activity中直接调用
if(!img.isDrawingCacheEnabled() || !holder.image.getTag().equals(imgpath)){img.setImageResource(R.drawable.icon_app);img.setTag(imgpath);try{new CanvasImageTask().execute(img);img.setDrawingCacheEnabled(true);}catch (Exception e) {Log.e("error", "RejectedExecutionException in content_img: " +  imgpath);

这样图片加载使用异步线程便不会进行堵塞发生错误,我们还可以使用 callback 在图片加载完后进行回调

public class CanvasImageTaskCall extends AsyncTask<ImageView, Void, Bitmap> implements Callback{private ImageView gView ;protected Bitmap doInBackground(ImageView... views) {Bitmap bmp = null ;ImageView view = views[0];// 根据iconUrl获取图片并渲染,iconUrl的url放在了view的tag中。if (view.getTag() != null) {try {URL url = new URL(view.getTag().toString());HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setDoInput(true);conn.connect();InputStream stream = conn.getInputStream();bmp = BitmapFactory.decodeStream(stream);stream.close();} catch (Exception e) {e.printStackTrace();Log.v("img", e.getMessage());Message msg = new Message();msg.what = 0;handleMessage(msg);return null;}}this.gView = view;return bmp;}protected void onPostExecute(Bitmap bm) {if (bm != null) {this.gView.setImageBitmap(bm);this.gView.setTag(bm);this.gView = null ;Message msg = new Message();msg.what = 1;handleMessage(msg);}}public boolean handleMessage(Message msg) {// TODO Auto-generated method stubreturn false;}}

在 Activity 中直接调用

new CanvasImageTaskCall(){@Overridepublic boolean handleMessage(Message msg) {switch (msg.what) {case 0:Log.i("test", "图片加载失败");break;case 1:Log.i("test", "图片加载成功");break;default:break;}saveButton.setTextColor(Color.WHITE);saveButton.setClickable(true);bitmap = (Bitmap) imageView.getTag();return super.handleMessage(msg);}}.execute(img);

转载于:https://my.oschina.net/u/559701/blog/87455

Android线程模型和AsyncTask相关推荐

  1. 【Netty】Netty线程模型和EventLoop

    Netty线程模型和EventLoop 由于线程模型确定了代码执行的方式,它可能带来一些副作用以及不确定因素, 可以说这是并发编程中最大的难点,因此,我们需要了解Netty所采用的线程模型,这样 在遇 ...

  2. 一站式WPF--线程模型和Dispatcher

    作者:周永恒  出处:http://www.cnblogs.com/Zhouyongh 开始着手写这个WPF系列,这里的一站式,就是力争在每一个点上能把它讲透,当然,做不到那么尽善尽美,如果有不对的地 ...

  3. OSI 七层模型和TCP/IP模型及对应协议(详解)

    OSI 七层模型和TCP/IP模型及对应协议(详解) 查看全文 http://www.taodudu.cc/news/show-6185847.html 相关文章: OSI7层网络模型协议精析 OSI ...

  4. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  5. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程

    许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...

  6. 有关Android线程的学习

    1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...

  7. (转)有关Android线程的学习

    1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...

  8. Android之多线程工作-AsyncTask与handler

    本文主要讲解下AsyncTask的使用以及Handler的应用 首先,我们得明确下一个概念,什么是UI线程.顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的, ...

  9. Java 内存模型和 JVM 内存结构真不是一回事

    这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...

最新文章

  1. android.view.InflateException: Binary XML file line #7: Binary XML file line #7
  2. git gui管理服务器配置文件,从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)...
  3. c语言 整型转bool,C语言的布尔类型(_Bool)【转】
  4. (转) 通过UUID在vSphere虚拟机内外识别硬盘
  5. Description Resource Path LocationType Java compiler level does not match the version of the instal
  6. Java配置分离之Spring远程配置
  7. ZOJ 3492 模拟循环链表线性查找
  8. python地图空间可视化神器folium实现以阿里巴巴园区为中心绘制租房小区位置信息
  9. 【转载】C++操作符的优先级
  10. Linux安装配置硬件温度及风扇转速监测软件(sensor、psensor)
  11. 在OpenWrt系统的路由器NETGEAR WNDR4300上安装KMS服务器vlmcsd
  12. html模板查询,前台模板查找
  13. 100%解决GitHub打不开或者打开慢
  14. 仿支付宝实现密码框输入
  15. 叶檀:别上了美国人的当 加息会给中国致命一击
  16. 2022房地产最新消息
  17. ES6 — ES11 新特性一篇通
  18. html中图片自动循环滚动代码,实现长图片自动循环滚动效果
  19. 浅谈人工智能:现状、任务、构架与统一
  20. 论文精读:D3S:D3S – A Discriminative Single Shot Segmentation Tracker

热门文章

  1. 我们从2021谷歌I/O大会给的谜题中发现了隐藏信息
  2. 马斯克的SpaceX又双叒叕融资了:喜提131亿,估值破3000亿
  3. 世界首例针对特斯拉自动驾驶判罚:德国裁定Autopilot广告误导买家,特斯拉柏林工厂可能受阻...
  4. 我一个普通程序员,光靠GitHub打赏就年入70万,要不你也试试
  5. 领扣-191 位1的个数 Number of 1 Bits MD
  6. Objective-C Reflection(Objective-C 反射机制)实用随笔笔记(持续更新)
  7. 快速连续点击两次出现相同内容的解决方法
  8. Kooboo CMS - Html.FrontHtml.Position 详解
  9. ISP线路类型【整理】
  10. Python中使用ElementTree解析xml