关于AsyncTask 你必须要了解的一些事情

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

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

一、AsyncTask是什么

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

(1)子线程中更新UI

 

(2)异步加载数据

 

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

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

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

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

 

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

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

 

myAsyncTask.execute() 其中该任务 
 
yAsyncTask.cancel() 取消该任务 
  • 1.
  • 2.
  • 3.

 

 

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

二、一个实际练习

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

 

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

 

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

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

 

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

 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

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

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

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

 

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

责任编辑:chenqingxiang 来源: fuly_android的博客
相关推荐

2018-09-21 11:11:34

备份离线自动

2018-11-08 12:07:38

备份手动磁盘

2021-06-07 11:33:24

服务器优化TIME-WAIT

2023-04-26 16:34:12

2017-02-09 14:46:25

Git事情

2011-12-14 16:43:54

javanio

2019-06-05 15:43:46

固态硬盘PC

2013-07-31 11:05:05

硬件处理ITM硬件

2018-11-28 10:00:42

React组件前端

2011-06-23 17:13:07

SEO

2016-12-23 08:59:00

AB 测试CRO

2016-11-14 15:30:49

阿里百川HotFix

2016-12-19 16:47:13

阿里百川HotFix

2021-04-27 22:27:19

手机安卓苹果

2017-10-29 06:50:30

前端开发CSSWeb

2019-09-03 15:33:35

网络安全保险网络安全网络攻击

2022-06-08 08:03:51

React.jsReactJS 库

2021-09-30 15:32:45

网络安全数据漏洞

2021-08-09 14:40:02

物联网IOT智能家居

2022-01-26 23:16:25

开源NLP 库GitHub
点赞
收藏

51CTO技术栈公众号