概述
在Android开发中,为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作,Anddroid开发框架提供了一个助手类AsyncTask,它对Thread和Handler进行了封装,方便我们使用。
涉及知识点
AsyncTask提供了四个回调方法,分别在不同的时期进行调用,具体如下:
- onPreExecute() 任务执行之前的准备操作
- doInBackground(Void... params) 任务执行体
- nProgressUpdate(Integer... values) 任务执行过程中状态更新
- onPostExecute(Void aVoid) 任务执行完毕操作
AsyncTask使用步骤
- 定义AsyncTask的子类,并在子类中实现回调函数
- 声明子类对象,并调用execute()方法
示例功能图
如下图所示:
示例源代码
定义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: =========执行完毕=========
备注
一日一钱,千日千钱,绳锯木断,水滴石穿。