【第22期】观点:IT 行业加班,到底有没有价值?

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机制处理。

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

相关文章推荐

一个例子谈谈AsyncTask的用法

Android前端复习
  • Kaiwii
  • Kaiwii
  • 2014-03-19 16:51
  • 3622

[Android]异步任务AsyncTask使用解析

AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。 AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型...

AsyncTask异步任务类

AsyncTask异步任务类,比Handle更轻量级,更适合简单的异步操作。内部封装了Handle,在使用AsyncTask类进行刷新控件的刷新操作时,不用再额外创建声明Handle,可以直接使Asy...

深入理解异步任务AsyncTask

异步任务AsyncTask         1、Android 的UI线程主要负责处理用户的按键事件、用户触屏事件及品目绘图事件等,不能处理耗时操作,否则UI界面会停止响应。(Android UI想成...

AsyncTask异步任务 源码解读

之前我们介绍了Handler的一些基本用法,也解读了Handler的源码。通过Handler我们可以简便的切换到主线程进行UI操作。而AsyncTask的出现使我们不用去关心线程管理和切换的一些细节,...

AsyncTask异步任务

最近在下载网络图片的时候,用到了AsyncTask,对于执行耗时任务,然后更新UI是一把利器。觉得有必要进行一些深入的了解 AsyncTask的基本用法 首先来看一下AsyncTask的基本用法,...

Android学习之异步任务AsyncTask

Android中有几种实现异步任务的方式,比如Handler,比如AsyncTask,Handler比较复杂,今天就不写了,相信不少童鞋都使用过AsyncTask,当然也有不少童鞋还不知道怎么用Asy...

Android中异步任务机制AsyncTask的理解

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界...

Android AsyncTask异步任务

在上一篇文章《Android网络编程之使用HttpClient进行Get方式通信》中,我们强制直接在UI线程进行网络操作,在实际的应用开发过程中不能这样做,因为这样很可能会阻塞UI,影响用户体验。为了...

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

一,android中的主线程和子线程android中的主线程可以认为是UI线程,在主线程不可以执行耗时的操作,否则就会给人一种卡顿的感觉。而主线程主要用于处理四大组件,以及处理它们和用户的交互。anr...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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