Android更新Ui的几种方法

常用的几种方法简单概括有:
- handler.sendMessage();
- handler.post();
- 在activity中可以 runOnUiThread();
- 在子view中可以  view.post()

实现代码省略比较简单。

android在生成页面的同时生成一个ViewRootImpl的对象,这个对象负责检查checkThread线程是否是在主ui线程,当我们尝试使用非ui线程更新视图时,checkThread则抛出异常。

//onCreate调用这段
         new Thread(new Runnable() {  
            @Override  
            public void run() {  
                titleView.setText("OtherThread");  
            }  
        }).start();

如果你在onCreate的时候这么写,系统不会抛出异常。

但是如果让线程睡一会比如

new Thread(new Runnable() {  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(200);  //睡了就再起不来了
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                titleView.setText("OtherThread");  
            }  
        }).start();  
会报错
@Override  
    protected void onResume() {  
        super.onResume();  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                titleView.setText("OtherThread");  
            }  
        }).start();  
    } 
这样写也不会报错,综上总结,就是在view未渲染前不会,渲染后就不能在子线程更新ui了

1.  在一个线程里边定义一个Looper    Looper.prepare(); //稍微有点儿多,详细见下文1
2.定义一个处理消息的Handler
    handler = new Handler()
    {       
        @Override
        public void handleMessage(Message msg)
        {                
            super.handleMessage(msg);                //处理逻辑
        }
    };
3.启动looper,并开始工作,轮询消息
    Looper.loop(); //详细见下文
    //要停止的话,使用Looper.quit();
4.在其他线程将要处理的数据data或回调对象callback以消息Message模式通过Handler发至该消息队列MessageQueue
    handler.sendMessage(msg)1
5.Looper的loop()方法会从消息队列中取到该消息并唤醒处理逻辑
    //即loop()方法中的代码
    for (;;) 
    { //显然这个死循环一直在等待消息到来并处理
            Message msg = queue.next(); // 取一条消息
            if (msg == null) 
            {                
                return;
            }
            msg.target.dispatchMessage(msg); //调用消息绑定的handler执行处理逻辑
            //other code....
    }
6.handler跳转到执行处理逻辑的过程
    public void dispatchMessage(Message msg) 
    {        
        if (msg.callback != null) { //如果有回调,则调用
        handleCallback(msg);
        } 
        else 
        {            
            if (mCallback != null) 
            {                
                if (mCallback.handleMessage(msg)) 
                {  
                   return;
                }
            }
            handleMessage(msg);
        }
    }    //调用回调方法
     private static void handleCallback(Message message) {
        message.callback.run();
    }
当我们要更新UI的时候,都会用到sendMessage,比如使用runOnUiThread,来看下这个方法
  public final void runOnUiThread(Runnable action) 
  {        /**
        *如果当前线程不为Ui主线程则使用定义好的mHandler
        */
        if (Thread.currentThread() != mUiThread) 
        {
            mHandler.post(action);
        } else 
        {
            action.run();
        }
  }
post方法也基本是一样的都是调用sendMessage
public final boolean post(Runnable r)
    {       return  sendMessageDelayed(getPostMessage(r), 0);
    }

 原文地址:


你可能感兴趣的:(Android更新Ui的几种方法)