一、关于异步消息处理机制
异步消息处理机制包含四部分:
- Message:用于在线程之间传递消息,可以携带少量的消息。
Message message = new Message();
//what、arg1和arg2字段可以携带一些整型数据
//obj字段可以携带一个Object对象
message.what = 1;
- Handler:用于发送和处理消息。发送消息一般是使用Handler的sendMessage方法,而消息的处理则是需要重写handleMessage方法,在方法内部对不同的消息进行不同的逻辑处理。
- MessageQueue:顾名思义,用于存放所有通过Handler发送的消息等待处理。每个线程只会有一个MessageQueue对象.
- Looper:用于维护和管理MessageQueue。每个线程中也只会有一个Looper对象。
使用异步消息处理机制的基本示例——在子线程中更新UI:
//设置更新TextView的消息码
public static final int UPDATE_TEXTVIEW = 1;
TextView tv_showMessage;
…… ……
……
btn_sendMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//在子线程中发送消息表示需要更新UI
Message message = new Message();
message.what = UPDATE_TEXTVIEW;
MyHandler handler = new MyHandler();
handler.sendMessage(message);
}
}).start();
}
});
…… ……
……
class MyHandler extends android.os.Handler {
//重写handleMessage方法用于处理消息
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case UPDATE_TEXTVIEW:
tv_showMessage.setText("Nice or not? ");
break;
default:
break;
}
}
}
二、关于AsyncTask
AsyncTask是一个基于异步消息处理机制的抽象类。使用AsyncTask需要自定义类来继承它并重写方法,继承AsyncTask时可以为AsyncTask类指定三个泛型参数AsyncTask <Params, Progress, Result >
:
- Params:在执行AsyncTask时需要传入的参数,可用于在后台任务中使用
- Progress:如果需要在界面显示当前的进度,则使用这里指定的泛型作为进度单位
- Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型
重写的方法 | 作用 |
---|---|
onPreExecute | 这个方法会在后台任务开始执行之前调用,用于对界面进行初始化 |
doInBackground | 这个方法中的所有代码都会在子线程中运行,所以所有耗时的操作都需要在这里执行。任务完成时我们可以通过return返回任务的执行结果,不过若是泛型参数Result指定为Void时就不需要返回结果。在这里如果需要更新UI的话可以通过调用publishProgress方法来实现。 |
onProgressUpdate | 当在后台任务中调用publishProgress方法后,这个方法将会被调用进行UI更新。 |
onPostExecute | 当后台任务执行完毕并通过return语句进行返回时,这个方法将会被调用,return的数据将会作为参数传入到这里。这里可以执行任务结束的UI操作,比如关闭进度条对话框或者提醒任务执行完毕等。 |
基础示例:
class DownloadTask extends AsyncTask< Void , Integer,Boolean > {
@Override
protected void onPreExecute() {
}
@Override
protected Boolean doInBackground(Void... voids) {
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
}
@Override
protected void onPostExecute(Boolean aBoolean) {
}
}