本文总结分析了Android中异步类AsyncTask用法。分享给大家供大家参考,具体如下:

最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉

这里有两种解释的方法,各有侧重点:

第一种解释:

Async Task 简介:

AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦

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

Params 启动任务执行的输入参数,比如HTTP请求的URL。

Progress 后台任务执行的百分比。

Result 后台执行任务最终返回的结果,比如String。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。

1) 子类化Async1Task

2) 实现AsyncTask中定义的下面一个或几个方法

onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。

doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。

onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

1) Task的实例必须在UI thread中创建

2) execute方法必须在UI thread中调用

3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法

4) 该task只能被执行一次,否则多次调用时将会出现异常

doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。

需要说明AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。

第二种解释:

AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:

1)准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。

2)正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。

3)进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。

4)完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。

5)取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用

AsyncTask的构造函数有三个模板参数:

(1)Params,传递给后台任务的参数类型。

(2)Progress,后台计算执行过程中,进步单位(progressunits)的类型。(就是后台程序已经执行了百分之几了。)

(3)Result, 后台执行返回的结果的类型。

AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可

第三:关于AsynTask与Handler的一些区别:

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

使用的优点:

a. 简单,快捷

b. 过程可控

使用的缺点:

a.在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

2. Handler异步实现的原理和适用的优缺点

在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给Handler、àHandler逐个获取Looper中的Message,并进行UI变更。

使用的优点:

a.结构清晰,功能定义明确

b.对于多个后台任务时,简单,清晰

使用的缺点:

a.在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

希望本文所述对大家Android程序设计有所帮助。

android服务绑定异步,Android中异步类AsyncTask用法总结相关推荐

  1. android r类 作用,Android 主项目和 Module 中 R 类的区别

    Android 主项目和 Module 中 R 类的区别 我们知道 Android 项目中会通过自动生成一个 R.java 类的方式来保存项目中所有资源文件的标识在主项目中生成的 R.java 中的资 ...

  2. android服务无法启动,Android服务无法启动(Android service would't start)

    Android服务无法启动(Android service would't start) 我正在尝试在Android中实现简单的服务,但我无法统计基本服务. 这是我的主要课程: import java ...

  3. C#中timer类的用法

    C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类 ...

  4. android中PreferenceScreen类的用法

    PreferenceScreen preference是偏好,首选的意思,PreferenceScreen个人翻译成 "偏好显示",明白这个意思就好,就是说根据特点灵活的定义显示内 ...

  5. android服务绑定音乐播放器,Android开发【04-21求助贴】使用后台服务的音乐播放器...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import android.Manifest; import android.content.pm.PackageManager; import and ...

  6. android服务开启线程,android之service与intentService的不同

    不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentServic ...

  7. android服务应用场景,Android Service的使用介绍

    简介 Service是Android应用程序中的一个组件,与用户不进行交互,可以长期的执行在后台.当新建一个服务的时候需要在AndroidManifest.xml文件中进行声明.服务可以通过Conte ...

  8. android服务下载apk,Android 一个简单的版本更新下载apk小示例

    一.简介: 1.运用 okhttp + notification 通知栏带进度的下载apk,下载完毕后并自动安装,如果用户取消可在通知栏点击安装,点击一次通知栏移除,同时支持自动静默下载(后台默默下载 ...

  9. android 服务自动结束,Android服务自动停止

    我正在制作一个带有闹钟功能的应用程序.我正在使用这种服务,不断检查设备的当前时间与我的数据库中的时间.Android服务自动停止 我的问题是,如果应用程序从后台删除或设备是rebooted,此serv ...

最新文章

  1. C语言函数调用一般分,C语言调用声明函数
  2. GCD Game 博弈论-Nim-质因数应用-质因数个数预处理
  3. 「后端小伙伴来学前端了」分析Vue脚手架结构
  4. TCP协议的4次握手
  5. 反思网络中的观点:太过杂乱 需要很强的甄别能力
  6. 你所阅读的,决定你是什么样的人
  7. Linux/Mac修改conda源,方便安装pytorch等
  8. 使用matlab计算并绘制连续信号的傅里叶变换
  9. 基于 HTML5 Canvas 的 3D 热力云图效果
  10. 百灵欧拓O2O移动广告平台
  11. bugku--never_give_up
  12. oracle科学计数法问题,ORACLE中科学计数法显示问题的解决
  13. 转载:ESP系统——ABS、TCS、VDC及VAF功能介绍
  14. 一个小把戏算法,获取大乐透,并且计算出最佳的结果(Qt C++ 和Android共用)
  15. 华为OD机试题:英文输入法单词联想
  16. CSP-J2020复赛题解
  17. 量子计算机和神威计算机哪个快,神威 计算机 IBM的量子计算机真的可以秒杀中国超算吗?(2)...
  18. Python 快速对比字符串的差异
  19. 2.Latex安装和TeXworks Editor基础
  20. Java 包及访问控制权限

热门文章

  1. TokuDB存储引擎
  2. mysql 获取所有用户所有权限存储过程
  3. [转]把复杂事物简明化
  4. WPF TreeView IsExpanded 绑定不上的问题
  5. CentOS下mysql安装
  6. csu 最优对称路径(bfs+记忆化搜索)
  7. oracle dba create view 失败 解决办法
  8. 转:PHP中实现非阻塞模式
  9. oracle odbc配置
  10. Eclipse窗口显示:独立、嵌入式