android中异步任务AsyncTask的应用和工作原理

原创 2016年05月31日 18:55:01

android4.0之后,android不允许在UI线程(主线程)中运行其他耗时线程,如网络请求的线程,否则就会崩溃抛出NetWorkOnMainThreadException

而且将耗时线程放入主线程中执行,会大大影响客户体验,所以android为我们提供了其他的处理方法,其中一种常用的就是,异步任务AsyncTask;

AsyncTask的底层其实是对Thread、Handler、Message的封装,智能的应用了Handler(子线程将运行结果返回到handler队列中,主线程定时扫描该队列,取出要用的值);

我们一般可以新建一个类**Task继承于AsyncTask类,通过覆写其方法实现主线程和子线程的数据交互:


1,新建一个任务继承AsyncTask需要传入三个参数,即:<Params, Progress, Result>

2,启动异步方法:new **Task().excute(?);?处用来向**Task()方法传值,即上面的Params(一般用map<>,或String);注意:每new一个对象只能进行一次调用excute()操作
3,常用的覆写方法有:

onpreExcute():此方法在开启异步方法后,第一个执行,属于对主线程的操作;应用:比如让某个控件隐藏等操作放进这个方法里;

onInBackground():此方法执行后,异步方法会自动开启一个线程(为什么不说new一个线程,这涉及到其底层的工作原理,后面会有阐述),执行该方法内部的逻辑,这个方法属于子线程的操作,要跟其他方法有所区分;

此方法会接收第一个参数Params,进行处理,并返回第三个参数Result,并可以在过程中进行第二个参数progress的赋值,通过publishProgress()方法将数值传递给下一个方法onProgressUpdate();

onProgressUpdate();此方法通过setProgress()处理从上面方法接收过来的数据,对UI线程的进度条控件进行管理;

onPostEcute():此方法可以接受onInBackground返回的Result,并对UI线程的某个控件进行管理;

4,异步方法的工作原理:

在异步方法工作时,会用到三个概念:任务队列缓冲池、线程池、线程队列

首先,当某个Task类继承了AysncTask并开启了excute()方法后,该任务就会进入任务队列缓冲池中进行排队,等待CPU的调度

其次,当该Task类的对象执行了onInBackgrond()方法后,系统会在线程池中找空闲线程,如果有,将给任务交给这个空闲线程处理,如果没有,会new一个线程来处理这个任务;

再次,接到任务的线程会进入到线程队列中进行排队,等待CPU的调用,和其他任务线程快速切换执行;

(扩展:为什么”其次“中会存在空闲线程?因为在系统的实际运行过程中,线程的开启和销毁会消耗大量的CPU资源,系统为了避免这种情况导致的系统卡顿,会建一个线程池,用来维护线程的持续运转,即当一个线程结束时,不会让它销毁,而是让其空转,等待接收其他任务,直到线程池销毁,线程才会销毁,这是android后台对线程的优化处理;另外,异步任务的线程池存放线程数量是有上限的(这也决定了异步任务只能处理稳定的,轻量级的多线程任务),超过其线程数量,任务将不会得到执行)

=================================

android3.0之前,异步任务是并发执行的,即几个任务同时切换执行,3.0之后,异步任务改成了顺序执行,即任务队列中的任务要一个个执行(并非按顺序),一个执行不完,不能执行另一个,即,顺序执行,他是默认的执行方式-execue()方法,其默认执行的方法是:executeOnExecutor(AsyncTask.SERIAL_EXECUTOR),如果要并发执行,需要执行AsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)且为了防止系统的任务繁重,只在线程池中维护了5个线程,也就是,每次最多跑5个任务(类似于迅雷下载)。如果需要并发更多的任务,需要自定义线程池了。所以异步任务只适合处理一些轻量级的并随时修改UI的异步线程,如果遇到繁重的任务,最好自己新建一个Thread并用handler和looper机制处理。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android异步处理四:AsyncTask的实现原理

本博文地址:http://blog.csdn.net/mylzc/article/details/6774131,转载请注明出处 Android异步处理系列文章索引 Android异步处理一:...
  • mylzc
  • mylzc
  • 2011年09月14日 12:51
  • 48378

终极方案:在高版本7.0上webview出现了二级页面白屏

直接在代码中进入这一段从7.0开始他的加载源码 是.getUrl().toString(). 所以要做一个判断 不加判断的情况就是,你的webview在不停的刷,如果你监听你的加载进度就会发现加载...

Android RelativeLayout常用属性~

// 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below 将该控件的底部置于给定ID的控件之下; andro...

AsyncTask,IntentService工作原理分析&Android线程池

一,android中的主线程和子线程android中的主线程可以认为是UI线程,在主线程不可以执行耗时的操作,否则就会给人一种卡顿的感觉。而主线程主要用于处理四大组件,以及处理它们和用户的交互。anr...

Android中线程形态AsyncTask、HandlerThread和IntentService工作原理分析

在《Android中线程形态AsyncTask、HandlerThread和IntentService简介》中,我们介绍了在Android中扮演线程角色的AsyncTask、HandlerThread...
  • lyz_zyx
  • lyz_zyx
  • 2017年03月13日 16:52
  • 170

《Android开发艺术探索》 -- AsyncTask 工作原理

前言 AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。从实现上来说,AsyncTask封装了...

Android AsyncTask 源码详细解析,掌握工作原理和细节

我们常常会在面试中被问及 xx 知识点用法,然后面试官会接着问是否了解其工作原理。无可厚非,我们不能仅仅满足于会用,难道你就不想知道它是如何工作的,不想了解它的源码吗?之前我们在 Android As...

源码解析Android中AsyncTask的工作原理

在之前的博客《Android中AsyncTask使用详解》中我们提到AsyncTask是对Thread和Handler的组合包装,本文将通过解析的方式让大家了解AsyncTask的工作原理。Async...

【android】AsyncTask的使用和工作原理

1AsyncTask 的使用 1参数 2常需要重写的四个方法 3取消 4注意事项 5内存可观测性 6执行顺序 2源码分析 1Callable 和 FutureTask 2 AsyncTask 源码 3...

Android AsyncTask工作原理

AsyncTask能够适当简单的使用在UI线程,在没有任务线程和handler的情况下,这个类也允许执行后台操作并将结果显示在UI线程上...
  • xyh269
  • xyh269
  • 2016年09月21日 10:28
  • 3356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android中异步任务AsyncTask的应用和工作原理
举报原因:
原因补充:

(最多只允许输入30个字)