一起学Android之AsyncTask

时间:2021-10-02 01:02:54

概述

在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: =========执行完毕=========

备注

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