在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题。如果在主线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot.CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

为什么要有handler机制?
handler的作用:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。
handler的原理:
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。   
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 whille死循环  
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
3)Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class MainActivity extends Activity {

protected static final int MSG_ONE = 1;
protected static final int MSG_TWO = 2;

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ONE:
// 执行1的操作
break;
case MSG_TWO:
// 执行2的操作
break;
};
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 耗时操作要在子线程中操作
new Thread() {
public void run() {
Message message = Message.obtain(); //获取消息的载体

if (condition) {
message.what = MSG_ONE;
} else {
message.what = MSG_TWO;
}
handler.sendMessage(message);
};
}.start();
}

}

package com.itheima.zhbj;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 耗时操作要在子线程中操作
new Thread() {
public void run() {

//执行耗时操作

//更新主线程UI
runOnUiThread(new Runnable() {
@Override
public void run() {

}
});
};
}.start();
}

}

最新文章

  1. 提高 ASP.NET Web 应用性能的 24 种方法和技巧
  2. javascript高级特性
  3. ProgressBar 源码
  4. jquery给元素添加样式表的方法
  5. highstock实现股票分时
  6. javascript将浮点数转换成整数的三个方法
  7. 我们究竟什么时候可以使用Ehcache缓存
  8. 获取机器本地的公网ip地址
  9. Unity3D脚本使用:Random
  10. 1、AngularJS 验证
  11. js获取本地ip和地区
  12. Jmeter_beanshell实现字符串加密
  13. Android官方技术文档翻译——Gradle 插件用户指南(4)
  14. Cut 'em all! CodeForces - 982C(贪心dfs)
  15. javascript DOM document属性
  16. scrapy笔记
  17. ProgressDemo
  18. kraken-ejs创建一个项目【学习札记】
  19. Git安装及密钥的生成
  20. 170310、Jenkins部署Maven多环境项目(dev、beta、prod)的参数设置

热门文章

  1. sync_binlog innodb_flush_log_at_trx_commit 浅析
  2. 微信【跳一跳】 opencv视觉识别 + 物理外挂
  3. WCF(一):初识WCF
  4. BZOJ3529: [Sdoi2014]数表
  5. AspectCore动态代理中的拦截器详解(一)
  6. spring自带定时器
  7. virtualbox虚拟机NAT模式下不能连接外网
  8. [OpenCV学习笔记1][OpenCV基本数据类型]
  9. 小工具:截图&简单图像处理
  10. 关于React Native的那些坑