Android程序有UI进程和后台进程,在执行一些耗时的操作时,如果在UI进程中,很可能出现假死的情况,用户体验会受到影响,因此,那些耗时进程往往就放在了后台进程中,用户体验能更好一些。网络情况不稳定,在向服务器请求数据时,也许要用到后台进程(Android4.0以后强制不能再主线程中访问网络),也可能用到AsyncTask,后面会介绍AsyncTask与Handler的区别,进行一下对比。

AsyncTask是一个抽象类(abstract class)是一个后台任务类,异步执行。

public abstract class AsyncTask<Params, Progress, Result>

AsyncTask继承自Object,在后台运行,结果在UI进程上发布。

异步任务被定义为三个泛型:

Params:启动任务执行的输入参数,如url

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

Result:后台执行任务的最终结果

执行的四个步骤:

onPreExecute():在doInBackground方法前执行,可以显示对话框显示进度(ProgressDialog)。

doInBackground(Params…):后台执行耗时、网络访问任务,过程中可以调用publicPregress(Progress… values)更新任务进度。

onProgressUpdate(Progress…):主线程执行,显示任务执行的进度,可以增加进度条增加用户体验度。

onPostExecute(Result):UI处理方法,在doInBackground中得到的返回值将作为该方法的参数。

onCancelles():用户调用取消时要做的操作,在cancel()和doInBackground()后执行

异步加载数据至少重写:doInBackground()和onPostExecute()

注意:task在UI进程中创建,并在UI进程中使用execute()方法调用启动,task只可以被执行一次,否则抛出异常。

可以调用cancel(boolean)尝试取消任务执行。

其中的内部类Status标志当前任务状态:FINISHED(结束),PENDING(还没有开始),RUNING(正在执行),可以调用getStatus()查看当前任务状态。

AsyncTask与Handler的对比:

AsyncTask:过程可控,简单快捷;不适用多个异步操作和UI改变

Handler:结构清晰,功能定义明确,多个任务后台执行时简单清晰;只有一个后台任务时闲的过于复杂。

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

Android AsyncTask学习的更多相关文章

  1. Android开发学习路线的七个阶段和步骤

    Android开发学习路线的七个阶段和步骤           Android学习参考路线     第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...

  2. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  3. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...

  4. Android动画学习(二)——Tween Animation

    前两天写过一篇Android动画学习的概述,大致的划分了下Android Animation的主要分类,没有看过的同学请移步:Android动画学习(一)——Android动画系统框架简介.今天接着来 ...

  5. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  6. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  7. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  8. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

  9. Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition

    Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition Property animation系统还提供了对ViewGroup中的View改变 ...

随机推荐

  1. log4net截取配置错误信息,(验证配置信息是否配置正确)

    在</system.web>之后 <!--log4错误日志配置:开始--> <system.diagnostics> <trace autoflush=&qu ...

  2. java日期操作

    //字符串转日期 public static void dt7() throws ParseException { String str_date="2015---08---08" ...

  3. input 不支持HTML5的placeholder属性

    解决方法如下: <input type="text" value="搜索乐高资讯" onfocus="if(this.value=='搜索乐高资 ...

  4. JS 闭包问题

    一.什么是闭包?“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太 ...

  5. Linux/Unix工具与正则表达式的POSIX规范

    http://www.infoq.com/cn/news/2011/07/regular-expressions-6-POSIX 对正则表达式有基本了解的读者,一定不会陌生『\d』.『[a-z]+』之 ...

  6. 在类库中使用log4net

    最近在做一个类库,用的C#写的,为了DEBUG方便需要日志输出,于是找了log4net这个工具进行日志输出; 因为调用这个类库的是C++,而且本人对C++不是很熟悉,于是无法在app.config或者 ...

  7. cf C. Sereja and Algorithm

    http://codeforces.com/contest/368/problem/C 从左向右记录从1位置到每一个位置上x,y,z的个数.然后判断在l,r区间内的x,y,z的关系满不满足abs(x- ...

  8. http://wiki.apache.org/tomcat/HowTo

    http://wiki.apache.org/tomcat/HowTo Contents Meta How do I add a question to this page? How do I con ...

  9. NOI2015 小园丁与老司机

    http://uoj.ac/problem/132 这道题前2行的输出比较容易,就是简单的动态规划,然后第3行就是比较少见的有上下界的最小流. 前2行比较容易,我们讨论一下第3行的解法吧. 比如第1个 ...

  10. C++链接器工具错误:LNK2001, LNK2019(转载)

    这是归属于链接器工具错误 这一类. 无法解析的外部符号“symbol” 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 可能的原因 代码请求的内容不存在(例如,符号拼写错误或使 ...