欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

一起学Android之AsyncTask

程序员文章站 2022-05-29 10:10:07
在Android开发中,为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作,Anddroid开发框架提供了一个助手类AsyncTask,它对Thread和Handler进行了封装,方便我们使用。 ......

概述

在android开发中,为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行ui更新等操作,anddroid开发框架提供了一个助手类asynctask,它对thread和handler进行了封装,方便我们使用。

涉及知识点

asynctask提供了四个回调方法,分别在不同的时期进行调用,具体如下:

  1. onpreexecute() 任务执行之前的准备操作
  2. doinbackground(void... params) 任务执行体
  3. nprogressupdate(integer... values) 任务执行过程中状态更新
  4. onpostexecute(void avoid) 任务执行完毕操作

asynctask使用步骤

  1. 定义asynctask的子类,并在子类中实现回调函数
  2. 声明子类对象,并调用execute()方法

示例功能图

如下图所示:

一起学Android之AsyncTask

 

示例源代码

定义asynctask的子类,并在子类中实现回调函数,源码如下:

 1  /**
 2      * 自定义任务类
 3      * params:表示任务接收参数类型
 4      * progress:表示进度类型
 5      * result:返回值类型
 6      * void是关键字void的占位符类
 7      */
 8     class mytask extends asynctask<void,integer,void>{
 9 
10         /**
11          * 任务执行之前的准备工作
12          */
13         @override
14         protected void onpreexecute() {
15             log.i(tag, "onpreexecute: =========准备=========");
16         }
17 
18         /**
19          * 任务执行
20          * @param params
21          * @return
22          */
23         @override
24         protected void doinbackground(void... params) {
25             log.i(tag, "doinbackground: =========正在执行=========");
26             for(int i=0;i<100;i++){
27                 publishprogress(i);
28                 try {
29                     thread.sleep(500);
30                 } catch (interruptedexception e) {
31                     e.printstacktrace();
32                 }
33             }
34             return null;
35         }
36 
37         /**
38          * 任务执行状态更新
39          * @param values
40          */
41         @override
42         protected void onprogressupdate(integer... values) {
43             int percent=(values[0]+1);
44             mtextview.settext(string.valueof(percent));
45             mprogressbar.setprogress(percent);
46         }
47 
48         /**
49          * 任务执行结束触发事件
50          * @param avoid
51          */
52         @override
53         protected void onpostexecute(void avoid) {
54             log.i(tag, "onpostexecute: =========执行完毕=========");
55             toast.maketext(mainactivity.this,"任务执行完毕",toast.length_short).show();
56         }
57     }

声明子类对象,并调用execute()方法,源码如下:

1     /**
2      * 点击事件
3      * @param v
4      */
5     public  void bn_task_click(view v){
6         //通过调用execute()方法,执行任务
7         log.i(tag, "bn_task_click: =========开始=========");
8         new mytask().execute();
9     }

调用日志如下所示:

1 07-21 14:00:30.499 18439-18439/com.hex.demotask i/demotask: bn_task_click: =========开始=========
2 07-21 14:00:30.501 18439-18439/com.hex.demotask i/demotask: onpreexecute: =========准备=========
3 07-21 14:00:30.502 18439-18675/com.hex.demotask i/demotask: doinbackground: =========正在执行=========
4 07-21 14:01:20.674 18439-18439/com.hex.demotask i/demotask: onpostexecute: =========执行完毕=========

备注

一日一钱,千日千钱,绳锯木断,水滴石穿。