Android的AsyncTask异步任务浅析

实现原理

内部封装了2个线程池+1个Handler(InternalHandler),1个线程池SerialExecutor任务排队,一个线程池THREAD_POOL_EXECUTOR执行任务。

常用重写的方法

onPreExecute:运行在主线程中,可做UI更新,显示进度条通知等。

doInBackground:在子线程执行任务,接收的参数类型为AsyncTask第一个泛型,返回给onPostExecute的参数类型为AsyncTask第三个泛型。

onProgressUpdate:运行在主线程中,doInBackground中调用publishProgress方法后即可回调到该方法中,用于UI进度更新。接收的参数类型为AsyncTask第二个泛型。

onPostExecute:运行在主线程中,doInBackground任务执行完毕后,就会回调到该方法中。

onCancelled:调用AsyncTask的cancel方法时,会回调到该方法中,内部调用Thread的interrupt方法,告诉线程池要取消任务,Thread在合适时机取消任务。

public class MyTask extends AsyncTask {

@Override // 子线程执行任务

protected Float doInBackground(String... strings) {

publishProgress(5D);

return 1f;

}

@Override // 准备执行doInBackground任务时回调

protected void onPreExecute() {

super.onPreExecute();

}

@Override // doInBackground任务执行结束后回调,接收的参数为doInBackground返回的值

protected void onPostExecute(Float aFloat) {

super.onPostExecute(aFloat);

}

@Override // doInBackground调用publishProgress会回调到该方法中

protected void onProgressUpdate(Double... values) {

super.onProgressUpdate(values);

}

@Override // 调用AsyncTask的任务关闭后回调

protected void onCancelled() {

super.onCancelled();

}

}

注意事项

Android4.1之前,AsyncTask类必须在主线程中加载。Android4.1之后,没有了这个要求,ActivityThread的main方法中自动加载了AsyncTask。

AsyncTask对象要在主线程创建,创建时,AsyncTask构造方法中,会拿到当前线程的Looper,传给new的Handler实例,以保证Handler是在主线程中。

public AsyncTask(@Nullable Looper callbackLooper) {

// 创建AsyncTask对象时,若不传外部的Handler实例,会走到这个构造中

// 拿到当前线程的Looper,传给new的Handler,则Handler在当前创建AsyncTask对象的线程中

// 因此,若要保证Handler执行环境在主线程,必须要在主线程中创建AsyncTask对象

mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()

? getMainHandler()

: new Handler(callbackLooper);

......省略无关代码

}

AsyncTask对象的execute方法必须在主线程中调用。execute方法有@MainThread注解。

Android3.0之前AsyncTask调execute方法是并行执行任务,3.0之后增加了SerialExecutor线程池,默认选择该线程池串行执行任务,若想并行执行,则直接调executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params)方法即可。

MyTask myTask = new MyTask();

// 默认在SerialExecutor线程池中串行执行

myTask.execute("1");

// 并行执行

myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "1");

一个AsyncTask对象,只能执行一次execute方法,第二次执行就会抛异常。

@MainThread // 主线程中执行的方法,默认选择SerialExecutor线程池串行执行任务

public final AsyncTask execute(Params... params) {

return executeOnExecutor(sDefaultExecutor, params);

}

@MainThread // 主线程中执行的方法。外部也可直接调这个方法执行任务,自己传入线程池选择是串行还是并行。

public final AsyncTask executeOnExecutor(Executor exec,

Params... params) {

// 一个AsyncTask对象,若多次执行execute,走到这里,会判断任务在执行中或已结束时,都将抛异常

if (mStatus != Status.PENDING) {

switch (mStatus) {

case RUNNING:

throw new IllegalStateException("Cannot execute task:"

+ " the task is already running.");

case FINISHED:

throw new IllegalStateException("Cannot execute task:"

+ " the task has already been executed "

+ "(a task can be executed only once)");

}

}

mStatus = Status.RUNNING;

onPreExecute();

mWorker.mParams = params;

exec.execute(mFuture);

return this;

}

内存泄漏问题。采用静态的AsyncTask继承类,若要引用外部,采用弱引用。

使用多个异步操作并需要进行UI变更时,用AsyncTask会很复杂,替换Handler会更灵活。

android异步任务更新进度条,Android的AsyncTask异步任务浅析相关推荐

  1. android 炫酷进度条,Android打造炫酷进度条效果

    本文实例为大家分享了Android炫酷进度条效果的具体代码,供大家参考,具体内容如下 HorizontalProgressbarWithProgress的代码 import android.conte ...

  2. android编程任务进度条,Android应用开发之AsyncTask 处理耗时操作和显示进度条

    在Android中实现异步任务机制有两种,Handler和AsyncTask.优缺点自己百度,推荐使用AsyncTask. private ProgressDialog dialog; //新建一个对 ...

  3. android 第三方圆弧进度条,android 可配置的圆弧进度条

    Arc ProgressBar Configurable 圆弧环形进度条 DEMO Attributes name format description borderWidth integer 圆弧边 ...

  4. Android自定义滑动进度条,Android自定义View实现圆形水波进度条

    每次听到某大牛谈论自定义View,顿时敬佩之心,如滔滔江水连绵不绝,心想我什么时候能有如此境界,好了,心动不如行动,于是我开始了自定义View之路,虽然过程有坎坷,但是结果我还是挺满意的.我知道大牛还 ...

  5. android仿微信 进度条,Android开发之模仿微信打开网页的进度条效果(高仿)

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是 ...

  6. android编程任务进度条,Android 进度条 ProgressBar - Android 入门教程

    今天要学的是一个特定场合要用到的控件--进度条控件.进度条的作用不言而喻,而在实际使用中,通常会有两种类型的进度条:横向进度条和圆形进度条.当然,ProgressBar 也是支持这两种类型的,可以应对 ...

  7. Android 自定义各种进度条,Android自定义百分数进度条

    上周看到群里有同学谈到自定义进度条的的问题,自己就针对百分数进度条自定义了一个.源码已经传到github上啦,可以下载下来直接能够运行的,也可以直接在里面根据自己的需求进行修改代码! 针对上周有朋友提 ...

  8. android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析

    这里用SeekBar做演示,SeekBar继承自ProgressBar,拥有其一切特性,并且其支持拖动以及DPAD左右键的进退.一起学习吧! 一.自定义SeekBar进度条样式 原生SeekBar效果 ...

  9. android 动态改变进度条,Android条纹进度条的实现(调整view宽度仿进度条)

    Android条纹进度条的实现(调整view宽度仿进度条) 发布时间:2020-10-03 16:14:24 来源:脚本之家 阅读:89 作者:RustFisher 前言 本文主要给大家介绍了关于An ...

最新文章

  1. NLP任务中的文本预处理步骤、工具和示例
  2. Nginx日志格式设置
  3. linux 环境变量文件_应急响应系列之Linux库文件劫持技术分析,有点硬核哟
  4. Intel Realsense D435 官方推荐有源USB线(有源电缆 cable)
  5. vs 启动调用的目标发生异常_如何解决不可测、异常场景的问题?
  6. oracle gets/exec 单位,ORACLE AWR使用基础
  7. msf:Known bug in WMI query, try migrating to another process
  8. 第六章——并行接口技术
  9. java集合迭代器_java集合迭代器
  10. TeXmacs - 所见即所得 - 专业排版软件
  11. Unicode -- 从code point到UTF16的计算方法
  12. matlab平衡小车数学模型PID,Simulink仿真
  13. 图解js中继承的几种方式
  14. c语言优先级详解pdf,C语言符号优先级.pdf
  15. 【可靠性测试】之容错性测试---测试检查点罗列
  16. sat数学可以用计算机吗,SAT数学计算器怎么使用?
  17. [Codeforces] AIM Tech Round 5 (rated, Div. 1 + Div. 2) 总结+题解
  18. 水文勘测工比赛计算机基本应用,水文勘测工技能大赛参赛感言
  19. 详谈Scrum和看板的区别
  20. 数据库习题(教材:刘爽英清华大学出版社版)

热门文章

  1. Watson的未来就是IBM的未来
  2. Linux sudo命令的概念与使用
  3. Beyond Compare 怎么新增与卸载文件格式
  4. 【转】移动客户端测试总结
  5. Java爬取网页源代码解析
  6. LinkedList线程安全问题
  7. Visual Studio 2010 Beta 2 公开下载地址
  8. 恢复Cisco路由器密码
  9. C++ string 成员函数 length() size() 和 C strlen() 的区别
  10. activemq高可用