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更新,如任务完成关闭进度条等

 

posted @ 2018-07-21 16:02  武当张三丰  阅读(893)  评论(0编辑  收藏  举报