zoukankan      html  css  js  c++  java
  • 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更新,如任务完成关闭进度条等
  • 相关阅读:
    使用CoreData [3]
    使用CoreData [2]
    使用CoreData [1]
    [翻译] CRPixellatedView-用CIPixellate滤镜动态渲染UIView
    简易使用UILabel的富文本
    [翻译] OrigamiEngine
    [翻译] DoActionSheet
    解决tableView中cell动态加载控件的重用问题
    ARC中用代码检测一个对象有没有释放掉
    HTTP请求中浏览器的缓存机制
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236333.html
Copyright © 2011-2022 走看看