一、解决新线程无法更新UI组建问题的方案

为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案:

  • 使用Handler实现线程之间的通信。

  • Activity.runOnUiThread(Runnable)。

  • View.post(Runnable)。

  • View.postDelayed(Runnable)。

二、ANR(Application Not Responding)异常

Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。

三、AsyncTask抽象类

AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:

  • Params:启动任务执行的输入参数的类型。

  • Progress:后台任务完成进度值的类型。

  • Result:后台执行任务完成后返回结果的类型。

四、AsyncTask的特点

  • 更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。

五、使用AsyncTask的步骤

1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。

2.根据需要,实现AsyncTask的如下方法:

doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。

onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。

onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。

onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。

3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。

六、使用AsyncTask时必须遵守的规则

  • 必须在UI线程中创建AsyncTask的实例。

  • 必须在UI线程中调用AsyncTask的execute()方法。

  • AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。

  • 每个AsyncTask只能被执行一次,多次调用将会引发异常。

Android基本功:异步任务(AsyncTask)的更多相关文章

  1. Android 之异步任务(AsyncTask,Handler,Message,looper)

    AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate ...

  2. Android中异步类AsyncTask的理解

    这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介:AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦  ...

  3. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  4. Android:异步处理之AsyncTask的应用(二)

    前言 在上一篇文章中<Android:异步处理之Handler+Thread的应用(一)>,我们知道Android的UI主线程主要负责处理用户的按键事件.用户的触屏事件以及屏幕绘图事件等: ...

  5. [转]Android:异步处理之AsyncTask的应用(二)

    2014-11-07     既然UI老人家都这么忙了,我们这些开发者肯定不能不识趣的去添乱阻塞UI线程什么的,否则UI界面万一停止响应了呢——这不是招骂的节奏么?!所以我们知道用Handler+Th ...

  6. Android源代码解析之(三)--&gt;异步任务AsyncTask

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了android中的异步消息机制. 主要解说了Handler对象的使用方式.消息的发送流程等.android的异步消息机制是android中多任务处 ...

  7. [Android] Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.LoaderCallbacks)

    Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.Lo ...

  8. Android必学之AsyncTask

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

  9. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)

    前言 如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文<Android:异步处理之Handler+Thread的应用(一)>:我们都知 ...

随机推荐

  1. Server Performance Advisor (SPA) 3.0

    http://blogs.technet.com/b/windows-server-china-blog/archive/2013/03/26/server-performance-advisor-s ...

  2. Python2.7.14安装和pip配置安装及虚拟环境搭建

    目录 前言 1 Python2.7.14安装 2 pip配置安装 3 虚拟环境安装   前言 今天在搭建阿里云服务器,需要安装Python相关环境,之前在本机都已经安装过两遍,今天又来安装一遍,安装具 ...

  3. 感谢大家对《Cocos2d-JS开发之旅》的支持

    昨天收到一封读者的来信,给我报了个喜,也提了一些非常好的建议. 他通过短短1个月时间就完成了学习和游戏开发,并发布了Android和iOS平台,真了不起.授人以鱼不如授人以渔,这也是写书的最大喜悦吧. ...

  4. 【转载】Java 网络编程

      本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一. ...

  5. V-rep学习笔记:机器人逆运动学解算

    IK groups and IK elements VREP中使用IK groups和IK elements来进行正/逆运动学计算,一个IK group可以包含一个或者多个IK elements: I ...

  6. maven project创建填充项

    GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称. 一般Gr ...

  7. 转:Ogre的SceneManager分析

    SceneManager分析 场景管理主要工作包括以下几点: 1.可移动.不可移动和可渲染物体的创建删除. 2.场景查询. 3.渲染队列. 4.动态阴影. 一. 场景对象创建 场景中的所有对象,包括可 ...

  8. 共享内存:mmap函数实现

    内存映射的应用: 以页面为单位,将一个普通文件映射到内存中,通常在须要对文件进行频繁读写时使用,这样用内存读写代替I/O读写,以获得较高的性能; 将特殊文件进行匿名内存映射,能够为关联进程提供共享内存 ...

  9. linux获取精准进程PID之pgrep命令

    pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行.在服务器的配置和管理中,这个工具常被应用,简单明了. 用法: #pgrep [选项] [程序名] pgrep [-flvx ...

  10. ios中自定义图层的2种方法

    1:自定义图层,在图层中画图 #import <QuartzCore/QuartzCore.h> @interface MJLayer : CALayer @end #import &qu ...