Android基础知识(十一):AsyncTask原理与使用简介

Android基础知识(十一):AsyncTask原理与使用简介

在Android应用开发的过程必须遵循单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
单线程模型有2条法则:

  1. 不要阻塞UI线程
  2. 确保只在UI线程中访问Android UI工具包

一、Android异步操作工具
Android提供了几种在其他线程中访问UI线程的方法:

  1. Activity.runOnUiThread(Runnable)
  2. View.post(Runnable)
  3. View.postDelayed(Runnable,long)
  4. Handler
    这些类或方法虽然能够实现异步操作,在其他线程中访问UI线程,但是在需要实现复杂的操作并且频繁地更新UI时会变得十分糟糕。
    Android1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级,适用于简单的异步处理,不需要借助线程和Handler即可实现
    在这里插入图片描述

二、AsyncTask简介
定义:AsyncTack是一个Android已封装好的轻量级异步类,属于抽象类。
作用:实现多线程、异步通信以及消息传递。
优点:方便实现异步通信——不需使用“任务线程+Handler”的复杂组合;节省资源——内部采用线程池的缓存线程+复用线程,避免了频繁创建&销毁线程所带来的系统资源开销。

三、AsyncTask工作原理简介
在这里插入图片描述
AsyncTask实现原理=线程池+Handler
其中:线程池用于线程调度、复用&执行任务;Handler用于异步通信
AsyncTask内部封装了2个线程池+1个Handler,具体介绍如下:
在这里插入图片描述

四、AsyncTask的方法、参数介绍
AsyncTask定义了三种泛型类型Params、Progress和Result:
① Params:启动任务执行的输入参数,如HTTP请求的URL。
② Progress:后台任务执行的百分比
③ Result:后台执行任务最终返回结果,比如String。
AsyncTask的核心方法:

  1. onPreExecute():该方法将在执行实际的后台操作doInBackground之前被UI thread调用,可以在该方法中做一些准备工作
  2. doInBackground(Params params):将在onPreExecute()方法执行后马上执行,该方法运行在后台线程中,不能更改UI组件的信息,主要负责执行耗时的后台计算工作,可以调用publishProgress方法来更新实时的任务进度。抽象方法。
  3. onProgressUpdate(Progress value):在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况。
  4. onPostExecute(Result result):在doInBackground方法执行完成后,onPostExecute方法将被UI thread调用,即线程任务结束时调用,后台的计算结果将通过该方法传递到UI thread。
  5. onCancelled():该方法将异步任务设置为取消状态,在异步任务被取消时自动调用。该方法被调用时,onPostExecute()不会被调用
    在这里插入图片描述
    方法的执行顺序:
    在这里插入图片描述

五、AsyncTask简单使用
一个使用AsyncTask的简单例子如下:
在这里插入图片描述
PS:AsyncTask的方法中,除了doInBackground()方法是后台线程之外,其余方法都处于主线程,因此在其余方法中是可以调用UI工具包的

参考资料:AsyncTask的用法
Android多线程:AsyncTask的原理及其源码分析