AsyncTask和Handler的区别介绍:
下面开始讲解异步机制,主线程和子线程的交互问题,涉及到两个最常用的类.
一.AsyncTask
特点:
- 1.android提供的”轻量级”异步类.
-
代码上比handler轻量级,但更耗性能. - 2.自定义类直接继承AsyncTask即可实现异步操作.
- 3.通过提供的接口可观测到:把当前异步执行的程度反馈给UI.
方法,参数:
两个核心的:
- 1.doInBackground(Params…)后台执行的”耗时操作”,处理参数,返回结果,配合publishProgress方法可以定时改变onPreogressUpdate方法从而实现定时更新进度.
2.onPostExecute(Result)处理得到的结果,在主线程处
理想要处理的.三个个性化的:
1.onPreExecute()执行任务前的操作:例如,显示进度对话框
- 2.onProgressUpdate(Progress),可以更新进度,增加用户体验
3.onCancelled(),用户取消时要做的操作
注意点:
1.实例,和execute()方法都要在UI线程创建
- 2.不要”手动”调用上述的方法.
- 3.task只能被执行一次.
1.优点:
简单快捷,过程可控制,降低开发难度(都给出明确的方法名了)
2.缺点:
"多个"异步操作并进行UI变更的时候,就变得复杂了
AsychTask代码详情
import android.os.AsyncTask;
/**
*
* @author chenzheng_java
* @description 异步任务AcyncTask示例
*
*/
public class MyAsyncTask extends AsyncTask<String, Integer, Object> {
/**
* 执行异步任务前的UI操作,例如:"进度对话框"和某项"前期功能".
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* 该方法在后台进行耗时操作。
* 该方法在onPreExecute方法之后进行,执行过程中,可以定时调用"publishProgress"方法,从而改变onProgressUpadate.
*/
@Override
protected Object doInBackground(String... params) {
return null;
}
/**
* doInBackground中调用了publishProgress之后,ui线程就会
* 调用该方法,通常我们才此方法进行进度条的更新,让用户更好的体验。
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
/**
* 当doInBackground执行完毕之后,可执行此方法,此方法在UI线程.
*/
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
}
}
详情用法:
二.Handler
特点:
- 1.Handler在主线程(UI)中,和子线程可以通过”Message对象”来传递数据.
- 2.Handler承担接收子线程传过来的(子线程用handler.sendMessage()方法传递)的”Message信息对象(里面包含了数据)”.
- 3.把主线程放入”主线程队列”中,配合主线程更新UI
handler结构图:
handler中的方法功能:
1.子线程中开启
1.post(runnable)//能在主线程更新UI 2.postAtTime(runnable,long)//定时执行 3.postDelayed(runable,long)//延迟执行
2.子线程中发消息的
1.sendMessage(Message);//标准的发消息 2.sendEmptyMessage(int flag);//发空消息,带个标记识别确认. 3.sendMessageAtTime(Message,long);//定时发消息 4.sendMessageAtTime(Message,long);//延迟多久发消息.
1.优点:
结构清晰,功能明确,利于多个后台任务的处理.
2.缺点:
单个后台异步处理时,显得代码过多,机构复杂.