Android线程管理之AsyncTask异步任务

产生背景:

     我们都知道Android应用程序是单线程模型,在子线程无法直接操作UI主线程,必须通过Handler机制,想了解这方面的知识可以参考这篇文章:Android消息传递之Handler消息机制(一),所以基于这种考虑所以我们一般情况会采用Thread+Handler来处理比较耗时的操作,但是我们都知道每次new Thread()开销比较大,而且缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪,不利于扩展,比如如定时执行、定期执行、线程中断,这时我们引入了线程池的概念,整个解决问题的模型就变成了Runnable+Executor+Handler,为了降低开发者的开发难度,AsyncTask应运而生,AsyncTask是对线程池的一个封装,使用其自定义的 Executor 来调度线程的执行方式(并发还是串行),并使用 Handler 来完成子线程和主线程数据的共享。

AsyncTask介绍

   AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度,最后反馈执行的结果给UI主线程.

AsyncTask主要参数、函数解析

 1.)AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result

  •  Params 启动任务执行的输入参数,比如下载URL
  •  Progress 后台任务执行的百分比,比如下载进度
  •  Result 后台执行任务最终返回的结果,比如下载结果

  2.)继承AsyncTask可以实现的函数

  •  onPreExecute()//此函数是在任务没被线程池执行之前调用 运行在UI线程中 比如现在一个等待下载进度Progress,也可以不用实现
  •  doInBackground(Params... params)//此函数是在任务被线程池执行时调用 运行在子线程中,在此处理比较耗时的操作 比如执行下载,此函数是抽象函数必须实现
  •  onProgressUpdate(Progress... values)//此函数是任务在线程池中执行处于Running状态,回调给UI主线程的进度 比如上传或者下载进度,也可以不用实现
  •  onPostExecute(Result result)//此函数任务在线程池中执行结束了,回调给UI主线程的结果 比如下载结果,也可以不用实现
  •  onCancelled(Result result)/onCancelled()//此函数表示任务关闭

 3.)AsyncTask主要公共函数

  • cancel (boolean mayInterruptIfRunning)//尝试取消这个任务的执行,如果这个任务已经结束或者已经取消或者不能被取消或者某些其他原因,那么将导致这个操作失败,当调用此方法时,此方法执行成功并且这个任务还没有执行,那么此任务将不再执行。如果任务已经开始,这时执行此操作传入的参数mayInterruptIfRunning为true,执行此任务的线程将尝试中断该任务
  • execute (Params... params)//用指定的参数来执行此任务,这个方法将会返回此任务本身,所以调用者可以拥有此任务的引用。此方法必须在UI线程中调用,此方法得到的线程是顺序执行的,即:执行完一个才会执行下一个(如果有多个)
  • executeOnExecutor(Executor exec,Params... params)//用指定的参数,运行在指定的线程池中,这个方法将会返回此任务本身,所以调用者可以拥有此任务的引用。此方法必须在UI线程中调用
  • get ()//等待计算结束并返回结果
  • get (long timeout, TimeUnit unit)//等待计算结束并返回结果,最长等待时间为:timeOut(超时时间)
  • getStatus ()//获得任务的当前状态  PENDING(等待执行)、RUNNING(正在运行)、FINISHED(运行完成)
  • isCancelled ()//如果在任务正常结束之前取消任务成功则返回true,否则返回false
发布了10 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u013323018/article/details/83217043