经常使用的几种方法简单归纳有:
- handler.sendMessage();
- handler.post();
- 在activity中能够 runOnUiThread();
- 在子view中能够 view.post()android
实现代码省略比较简单。ide
android在生成页面的同时生成一个ViewRootImpl的对象,这个对象负责检查checkThread线程是不是在主ui线程,当咱们尝试使用非ui线程更新视图时,checkThread则抛出异常。oop
//onCreate调用这段 new Thread(new Runnable() { @Override public void run() { titleView.setText("OtherThread"); } }).start();
若是你在onCreate的时候这么写,系统不会抛出异常。post
可是若是让线程睡一会好比ui
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); } 原文地址: