常见的多线程方法有:

  1. 继承Thread类
  2. 实现Runnable接口
  3. Handler
  4. AsyncTask
  5. HandlerThread

1.定义

  • 一个Android已经封装好的轻量级异步类
  • 属于抽象类,即使用时需要实现的子类
public abstract class AsyncTask<Params, Progress, Result> { ... }

2.作用

  1. 实现多线程
    在工作线程中执行任务,如耗时任务。
  2. 异步通信,消息传递
    实现工作线程和主线程之间的通信,即将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作,从而保证线程安全。

3. 优点

  • 方便实现异步通信:
    不需要使用“任务线程(如继承Thread类)+Handler“的复杂组合
  • 节省资源:
    采用线程池的缓存线程+复用线程,避免了频繁创建&销毁线程所带来的系统资源开销。

4.类和方法

4.1类的定义

AsyncTask类术语抽象类,即使用时需要实现子类

public abstract class AsyncTask<Params, Progress, Result> { ...
}// 类中参数为3种泛型类型
// 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型
// 具体说明:// a. Params:开始异步任务执行时传入的参数类型,对应excute()中// b. Progress:异步任务执行过程中,返回下载进度值的类型// c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
// 注:// a. 使用时并不是所有类型都被使用// b. 若无被使用,可用java.lang.Void类型代替// c. 若有不同业务,需额外再写1个AsyncTask的子类
}

4.2核心方法

核心方法如下:

方法的执行顺序:

5.使用步骤

  1. 创建AsyncTask子类并根据需要实现核心方法
  2. 创建AsyncTask子类的实例对象
  3. 手动调用execute()从而执行异步线程任务
/*** 步骤1:创建AsyncTask子类* 注: *   a. 继承AsyncTask类*   b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替*   c. 根据需求,在AsyncTask子类内实现核心方法*/private class MyTask extends AsyncTask<Params, Progress, Result> {....// 方法1:onPreExecute()// 作用:执行 线程任务前的操作// 注:根据需求复写@Overrideprotected void onPreExecute() {...}// 方法2:doInBackground()// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果// 注:必须复写,从而自定义线程任务@Overrideprotected String doInBackground(String... params) {...// 自定义的线程任务// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()publishProgress(count);}// 方法3:onProgressUpdate()// 作用:在主线程 显示线程任务执行的进度// 注:根据需求复写@Overrideprotected void onProgressUpdate(Integer... progresses) {...}// 方法4:onPostExecute()// 作用:接收线程任务执行结果、将执行结果显示到UI组件// 注:必须复写,从而自定义UI操作@Overrideprotected void onPostExecute(String result) {...// UI操作}// 方法5:onCancelled()// 作用:将异步任务设置为:取消状态@Overrideprotected void onCancelled() {...}}/*** 步骤2:创建AsyncTask子类的实例对象(即 任务实例)* 注:AsyncTask子类的实例必须在UI线程中创建*/MyTask mTask = new MyTask();/*** 步骤3:手动调用execute(Params... params) 从而执行异步线程任务* 注:*    a. 必须在UI线程中调用*    b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常*    c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute() *    d. 不能手动调用上述方法*/mTask.execute();

6.具体实例

public class MainActivity extends AppCompatActivity {// 线程变量MyTask mTask;// 主布局中的UI组件Button button,cancel; // 加载、取消按钮TextView text; // 更新的UI组件ProgressBar progressBar; // 进度条/*** 步骤1:创建AsyncTask子类* 注:*   a. 继承AsyncTask类*   b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替*      此处指定为:输入参数 = String类型、执行进度 = Integer类型、执行结果 = String类型*   c. 根据需求,在AsyncTask子类内实现核心方法*/private class MyTask extends AsyncTask<String, Integer, String> {// 方法1:onPreExecute()// 作用:执行 线程任务前的操作@Overrideprotected void onPreExecute() {text.setText("加载中");// 执行前显示提示}// 方法2:doInBackground()// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果// 此处通过计算从而模拟“加载进度”的情况@Overrideprotected String doInBackground(String... params) {try {int count = 0;int length = 1;while (count<99) {count += length;// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()publishProgress(count);// 模拟耗时任务Thread.sleep(50);}}catch (InterruptedException e) {e.printStackTrace();}return null;}// 方法3:onProgressUpdate()// 作用:在主线程 显示线程任务执行的进度@Overrideprotected void onProgressUpdate(Integer... progresses) {progressBar.setProgress(progresses[0]);text.setText("loading..." + progresses[0] + "%");}// 方法4:onPostExecute()// 作用:接收线程任务执行结果、将执行结果显示到UI组件@Overrideprotected void onPostExecute(String result) {// 执行完毕后,则更新UItext.setText("加载完毕");}// 方法5:onCancelled()// 作用:将异步任务设置为:取消状态@Overrideprotected void onCancelled() {text.setText("已取消");progressBar.setProgress(0);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 绑定UI组件setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button);cancel = (Button) findViewById(R.id.cancel);text = (TextView) findViewById(R.id.text);progressBar = (ProgressBar) findViewById(R.id.progress_bar);/*** 步骤2:创建AsyncTask子类的实例对象(即 任务实例)* 注:AsyncTask子类的实例必须在UI线程中创建*/mTask = new MyTask();// 加载按钮按按下时,则启动AsyncTask// 任务完成后更新TextView的文本button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {/*** 步骤3:手动调用execute(Params... params) 从而执行异步线程任务* 注:*    a. 必须在UI线程中调用*    b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常*    c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()*    d. 不能手动调用上述方法*/mTask.execute();}});cancel = (Button) findViewById(R.id.cancel);cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 取消一个正在执行的任务,onCancelled方法将会被调用mTask.cancel(true);}});}}

Android多线程--AsyncTask相关推荐

  1. Android 多线程-----AsyncTask详解

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  2. Android 多线程-----AsyncTask详解(康小岱已读)

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...

  3. Android 多线程AsyncTask详解

    原文地址:http://www.cnblogs.com/xiaoluo501395377/p/3430542.html 本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机 ...

  4. 大话Android多线程(六) AsyncTask知识扫盲

    版权声明:本文为博主原创文章,未经博主允许不得转载 源码:github.com/AnliaLee 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言 本章我们将结合之前几篇博客,来研究研究多 ...

  5. Android多线程----异步消息处理机制之Handler

    虽然是国庆佳节,但也不能停止学习的脚步,我选择在教研室为祖国母亲默默地庆生. 关于Android的多线程知识,请参考本人之前的一篇博客:Android 多线程----AsyncTask异步任务详解 在 ...

  6. Android之AsyncTask异步任务详解总结

    Android 多线程----AsyncTask异步任务详解 [正文] 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多 ...

  7. Android多线程(Handler篇)

    [齐天的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qijinglai/article/details/80685226 关联文章: Android多线程(Han ...

  8. Android多线程任务优化1:探讨AsyncTask的缺陷

    AsyncTask还有别的缺陷,在生成listview的时候,如果adapter里面的count动态改变的话,不能使用AsyncTask,只能使用Thread+Handler,否则会出现如下错误 ja ...

  9. Android必学之AsyncTask,多线程AsyncTask,详细AsyncTask使用教程

    AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. 为什么需要使用异步任务? ...

最新文章

  1. 简谈Redis的线程模型
  2. 跟老杨学java系列(一)前传
  3. custom field further usage - add into UI and report
  4. python参数估计_用python求参数估计的置信区间
  5. .Net下你不得不看的分表分库解决方案-多字段分片
  6. cesium获取模型实时坐标_Cesium 顶点着色器中解算模型坐标
  7. 【“零起点”--百度地图手机SDK】如何创建一张地图
  8. android.content.SharedPreferences.edit()
  9. [uoj30][CF Round #278]Tourists——树链剖分+圆方树
  10. 教程篇(6.0) 01. FortiGate及其Security Fabric介绍 ❀ FortiGate 安全 ❀ Fortinet 网络安全专家 NSE 4
  11. 前端开发知识点整理(1)—网络—秋招/春招/实习/工作
  12. 如何实现 Oracle 的自增序列,两步轻松搞定
  13. python弧度值转角度值_python 弧度与角度互转实例
  14. UVA一些简单题题解。
  15. 控制系统的复域数学模型
  16. 「自控元件及线路」5 步进电机及其控制
  17. 理光Ricoh Aficio MP 2852 一体机驱动
  18. Java编写简易计算器
  19. php实现一键分班,学生一键分班软件下载
  20. 【高级】管理科学基础知识

热门文章

  1. 房产管理信息系统 oracle,房地产企业项目信息管理系统|案场管理系统
  2. windows分辨率修改工具_3个修改图片DPI的方法
  3. centos7.6 安装nginx-1.14.2
  4. Activity的Launch mode详解,A B C D的singleTask模式
  5. MHA高可用 MHA+Keepalive
  6. Qt学习之路(60): 创建shared library
  7. 3.9 限制root远程登录
  8. js 创建多行字符串
  9. 产品研发管理(二):使用SubVersion进行代码管理
  10. spring入门常见的问题及解决办法