一起学Android之AsyncTask
程序员文章站
2022-05-29 10:10:07
在Android开发中,为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作,Anddroid开发框架提供了一个助手类AsyncTask,它对Thread和Handler进行了封装,方便我们使用。 ......
概述
在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: =========执行完毕=========
备注
一日一钱,千日千钱,绳锯木断,水滴石穿。