Android里如何在子线程更新UI
一、Message:在线程间传递消息,传输少量数据
Handler:发送和处理消息(Message),必须定义在主线程中,如果是多个类直接互相调用,需要传递content对象
或通过接口调用。
Message有int静态变量what(判断消息),int静态变量arg1、arg2,静态Object对象obj
Handler有以下调用方法:
sendMessage(Message):发送Message
以下可重写方法:
handleMessage(Message):可重写,接收Message,在此处更新UI
具体例子
//定义在主线程的Handler类,并重写handleMessage()方法
public Handler handler = new Handler() {
//接收Message,并对UI的处理
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//完成主界面更新,拿到数据
String data = (String)msg.obj;
textView.setText(data);
break;
default:
break;
}
}
};
//子线程类发送消息
public void send{
new Thread(new Runnable(){
public void run(){
Message msg=new Message();
msg.what=0;
MainActivity.handler.sendMessage(message); //发送Message
}
}).start();
}
二、.AsyncTask:子线程不能更新UI:因此在一些下载任务需要进度更新,文件读取等耗时操作,如果全部放到主线程去执行,就可能会造成后面任务的阻塞,所以使用AsyncTask进行异步操作
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承.继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务时输入的参数类型.
Progress:后台任务执行中返回进度值的类型.
Result:后台任务执行完成后返回结果的类型.(可为Boolean判断成功失败)
.构建AsyncTask子类的回调方法
AsyncTask有以下可重写方法(doInBackground必须重写,其余可写可不写):
doInBackground(Params):异步执行后台线程任务,耗时操作将在此方法中完成.
onPreExecute():执行后台任务前被调用,通常用于进行初始化操作.
onProgressUpdate(Progress)::当doInBackground()方法中调用publishProgress(Progress)方法后,将自动调用此方法.通过此方法我们可以更新任务的进度,可通过此方法进行UI的更新.
onPostExecute(Result)::当doInBackground()方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值(即Result),此方法可以进行UI更新,如任务完成关闭进度条等