大家都知道,在子线程中是不能更新UI的,必须要采用异步消息处理机制。一般的做法就是在有需要的地方,使用Handler发送消息给主线程,然后在主线程中处理消息更新UI。如果好多子线程都有更新UI的需求,那么场面就有点难以控制了,大家必须在代码中手动处理Handler的消息请求。这样子问题显然会复杂很多。其实这样子的情况android已经为我们考虑到了。AsyncTask就是天生被android设计出来为我们解决这样子的问题的。其实翻看源码,就会知道AsyncTask的底层封装的仍然是android的Handler消息处理机制。下面的几篇文章就来详细的学习什么是AsyncTask,以及它是如何做的。

一、AsyncTask是什么

AsyncTask是android给我们封装的一套异步消息处理工具。使用这个工具,可以让异步消息的处理变得更加的简单,开发者避免了很多的麻烦。也就是说AsyncTak天生用来被设计做两件事:

  1. 1)子线程中更新UI
    2)异步加载数据

下面来学习一下关于它的最基础的知识。

首先AsyncTask是一个抽象类,必须要创建它的子类。但是在继承AsyncTask类的时候,需要指定三个泛型参数。解释分别如下:

  1. 1Params
    在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
    2Progress
    后台任务在执行时,如果需要在界面上显示当前进度,则就用Progress指定的泛型作为进度单位。
    3Result
    当后台任务执行完毕后,如果需要对结果进行返回,那么就用这里指定的泛型作为返回的类型。

然后一般在子类中,需要重写下面的几个回调方法,他们都是自动被调用的,不要在代码中人工调用。

  1. 1onPreExexute()
    该方法在后台任务执行前,即doInBackground方法执行前被调用。通常在这里执行一些初始化的操作,比如显示一个进度条。
    2doInBackground(Params...)
    该方法用来执行后台任务,它的所有代码都是在子线程中操作,任务一旦完成就会用return来返回结果。当然它的参数和返回结果的类型就是上面我们所指定的ParamsResult。千万注意,不要在这个
    方法中执行更新UI的操作。如果需要更新UI元素,比如说反馈当前任务的进度,可以调用publishProgress(Progress...)方法来完成。
    3onProgressUpdate(Progress...)
    当在后台任务中调用了publishProgress方法后,就会自动调用该方法,方法中的参数就是publishProgress方法传递过来的。这个方法可以对UI进行更新。
    4onPostExecute(Result)
    当后台任务执行完毕,即doInBackground执行完毕后,该方法被调用。doInBackground返回的结果就是该方法的参数,这这里可以执行任务完成后的逻辑,比如说关闭一个进度条,更新一些UI等。

需要说明的是这几个方法,只有doInBackground方法是在子线程中执行的,其他的都是在主线程中执行的。那么启动和取消这个任务的方法是什么呢?如下:

  1. myAsyncTask.execute() 其中该任务
  1. myAsyncTask.cancel() 取消该任务

好了,了解到上面的基础知识后,我们来做一个小练习,加深一下印象。

二、一个实际练习

我们来编写出一个AsynTask子类,实际运行一下吧。新建项目,然后新建子类继承自AsynTask,代码如下:

  1. package com.example.asynctasktest;
  2.  
  3. import android.os.AsyncTask;
  4. import android.util.Log;
  5.  
  6. public class MyAsyncTask extends AsyncTask<Void, Void, Void>{
  7.  
  8. protected Void doInBackground(Void... params) {
  9. Log.d("付勇焜----->","doInBackground");
    publishProgress();
  10. return null;
  11. }
  12.  
  13. protected void onPreExecute() {
  14. Log.d("付勇焜----->","onPreExecute");
  15. super.onPreExecute();
  16. }
  17.  
  18. protected void onPostExecute(Void result) {
  19. Log.d("付勇焜----->","onPostExecute");
  20. super.onPostExecute(result);
  21. }
  22.  
  23. protected void onProgressUpdate(Void... values) {
  24. Log.d("付勇焜----->","onProgressUpdate");
  25. super.onProgressUpdate(values);
  26. }
  27.  
  28. }

我们编写了一个最简单的AsyncTask子类,传入的参数都是空值, 然后在每一个方法中都打印出一句话,主要是为了便于观察他们的执行顺序。

然后我们再修改MainActivity的代码,如下:

  1. package com.example.asynctasktest;
  2.  
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5.  
  6. public class MainActivity extends Activity {
  7.  
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11.  
  12. MyAsyncTask mTask = new MyAsyncTask();
  13. mTask.execute();
  14. }
  15.  
  16. }

然后运行程序,打印结果如下:

从打印的结果很容易就看出方法的执行顺序了吧。如下:

onPreExecute------>onProgressUpdate(调用了publishProgress方法才会调用该方法)------->doInBackground--------->onPostExecute

好了,本篇文章带你大致了解了一下AsynTask的基础知识,那么在下一篇文章中,就一起来做一个实际例子吧,熟练使用AsynTask这套机制!

AsyncTask基础知识的更多相关文章

  1. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  2. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  3. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  4. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  5. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  6. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  7. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  8. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. 我该不该学习C语言

    这几天把c语言过了一遍,基本上算是入门了,常用语法.函数的使用.c语言是比较古老的语言了,很多系统的底层.工业控制软件都是使用C语言编写,过一遍之后觉得c语言屹立不倒是有原因.c程序员有一句话:使用c ...

  2. HDU 5656 ——CA Loves GCD——————【dp】

    CA Loves GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  3. Tomcat热启动

    ===== 2017.7.1 ===== 如果是对原来的类方法修改,那么热启动非常好用:如果是添加了新的类或方法(非最上层的controller),那么此方法也是好用的:但是如果是在controlle ...

  4. MVVMLight - Messenger 2

    本篇介绍MvvmLight中一个重要的东东,那就是Messenger. (一)Messenger的基本组成 Messenger类用于应用程序的通信,接受者只能接受注册的消息类型,另外目标类型可以被指定 ...

  5. instanceof -- JS

    在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”. ...

  6. Java基础(八)异常处理

    一.异常 异常是指程序在运行过程产生的不正常情况.语法错误不算异常. 1.异常体系 Throwable:Java语言中所有错误或异常的超类:Throwable 类的子类有两个:1.Error:2.Ex ...

  7. 鼠标拖动改变DIV等网页元素的大小的最佳实践

    1.初次实现 1.1 html代码 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" la ...

  8. C++中细节知识点

    C++中常识小知识: 1.在C++的类中成员变量与成员函数默认为私有的,结构体中的成员变量与成员函数默认为公有的. 2.C++中this关键字是指针,指向当前对象. 3.在C++中一般类的成员变量与成 ...

  9. 二、NAT(地址转换模式)

    刚刚我们说到,如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择.NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网.其网络结构如下图所示: NA ...

  10. 201610-H5项目总结

    1.首屏进入动效使用jQuery的animate(); $('.btn_driver').animate({ left:'26%' },'slow'); $('.btn_show').animate( ...