一、Message、Handler、MessageQueue和Looper
1.新建Handler实例
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case UPDATE_TEXT: //UPDATE_TEXT为常量
mTvText.setText("改变文本");
break;
}
}
};
2.在子线程中,调用Handler.sendMessage(Message)方法
Message message = new Message();
message.what=UPDATE_TEXT;
mHandler.sendMessage(message);
3.原理
3.1Message
Message是传递的信息,可携带what、arg1、arg2等整形信息;
3.2Handler
用于发送消息和处理消息。
Handler.sendMessage()方法发送消息。发送消息后,最终调用Handler.handleMessage()方法。
3.3MessageQueue消息队列
存放Handler发送的消息,这些消息等待被处理。每个线程只有一个MessageQueue对象。
3.4Looper
Looper管理MessageQueue。调用Looper.loop()方法后,进入无限循环,每当发现MessageQueue中存在消息,将
它取出,调用handleMessage()方法。每个线程只有一个Looper对象。
3.5总结
Handler调用sendMessage()方法发送消息,消息发送到MessageQueue中,等待处理,Looper处理MessageQueue
中的消息,调用handler.handleMessage()方法。
二、AsyncTask
1.新建类继承自AsyncTask
泛型参数1:传入参数(如:传入下载Url)
泛型参数2:显示进度的单位
泛型参数3:返回结果类型(返回是否下载成功)
2.重写AsyncTask的4个方法
class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();//显示进度对话框
}
@Override
protected Boolean doInBackground(Void... params) {
try{
while(true){
int downloadPercent = doDownload();//获取下载进度
publishProgress(downloadPercent);//更新UI的下载进度
if(downloadPercent>=100){
break;
}
}
}catch (Exception e){
return false;//下载失败
}
return true;//下载成功
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setMessage("下载"+values[0]+"%");//更新UI
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(aBoolean);
progressDialog.dismiss();//关闭进度对话框
if(result){
//下载成功
}else{
//下载失败
}
}
}
2.1 onPreExecute()
执行后台任务前调用,用于界面初始化,如显示进度条对话框。
2.2 doInBackground(Params...)
传入参数为泛型参数1;返回参数为泛型参数3;
在子线程中调用,执行耗时操作。不能执行UI操作,可调用publishProgress(Progress...)方法进行UI跟新。
执行完操作调用 return。
2.3 onProgressUpdate(Progress...)
传入参数为泛型参数2;
调用了publishProgress()方法后,很快调用该方法。可进行UI操作,进行UI更新。
2.4 onPostExecute(Result)
传入参数为泛型参数3;
当doInBackground()方法执行return后,很快调用该方法。
可进行UI操作,如关闭
3.启动任务
new DownloadTask().excute();