2019独角兽企业重金招聘Python工程师标准>>>

常用的几种方法简单概括有:
- 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.定义一个处理消息的Handlerhandler = new Handler(){       @Overridepublic void handleMessage(Message msg){                super.handleMessage(msg);                //处理逻辑}};
3.启动looper,并开始工作,轮询消息Looper.loop(); //详细见下文//要停止的话,使用Looper.quit();
4.在其他线程将要处理的数据data或回调对象callback以消息Message模式通过Handler发至该消息队列MessageQueuehandler.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);}原文地址:

转载于:https://my.oschina.net/u/2370693/blog/544002

Android更新Ui的几种方法相关推荐

  1. Android 更新UI的两种方法——handler和runOnUiThread()

    Android 更新UI的两种方法--handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外 ...

  2. 【转】探讨android更新UI的几种方法----不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  3. 安卓更新UI的几种方法

    安卓更新UI的几种方法: 1.利用Looper更新UI界面   如果我们的代码需要随时将处理后的数据交给UI更新,那么我们想到的方法就是另开一个线程更新数据(也必须这么做,如果我们的数据更新运算量较大 ...

  4. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  5. [Android开发]Android更新UI的五种方式

    Android更新UI的五种方式: 1.handler.post 2.activity.runOnUiThread 3.view.post 4.handler+Thread 5.AsyncTask 下 ...

  6. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

  7. Android非UI线程更新UI的几种方法

    2019独角兽企业重金招聘Python工程师标准>>> Android用于实现非UI线程与UI线程的交互方法如下: 1.Handler 2.Activity.runOnUIThrea ...

  8. Android 更新UI的几种方式

    1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { ...

  9. android更新UI(界面)的方法;android刷新界面数据的方法;android定时器更新界面

    Android中常常需要对UI界面进行更新.下面我将介绍的是定时更新UI的几种方法: 一.定时器更新UI的两种方法 1.使用Timer的方式 private Timer timer=new Timer ...

最新文章

  1. R2LIVE: 一个鲁棒实时的雷达-惯导-视觉紧耦合的位姿估计和建图系统
  2. Controller 层实现
  3. linux tcp重传多会导致软中断在各个核很不均匀么?
  4. 10分钟教你看懂mongodb的npm包
  5. Linux:mkdir 创建多级目录
  6. 用包管理python代码,提高开发效率
  7. ​十大骨传导耳机品牌,骨传导耳机推荐跑步用
  8. MySQL调用存储过程和函数
  9. lingix系统安装服务器,安装ngix
  10. IIS发布网站及网页显示设置
  11. vue 点击展开显示更多 点击收起部分隐藏
  12. 微信支付生成签名和验签SDK源码分析
  13. 国内网友设计诺基亚Lumia 930概念机
  14. 陕西国防 c语言第三章实训三答案,C语言程序设计实验指导
  15. uniapp uview-ui退出登录后重新登录token不是最新的解决方案
  16. Macbook 安装Android Studio以及解决卡顿问题
  17. 如何在ST官网和keil官网下载相关资料(外设库和芯片器件库)
  18. 资料员培训建筑八大员培训建筑资料员工程建筑资料与施工管理
  19. OpenCV 无法解析的外部符号 __imp_opj_image_destroy解决方案
  20. c++主函数中调用类内函数的方法

热门文章

  1. 分享Silverlight/WPF/Windows Phone一周学习导读(07月18日-07月24日)
  2. Kudu command tools
  3. 《Spark大数据分析实战》——1.4节弹性分布式数据集
  4. mac apache 和 nginx ssl 配置自签名的SSL
  5. diamond types are not supported at this language level
  6. Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学
  7. deepin linux 大小,关于安装Deepin 20系统选择全盘安装后硬盘容量比实际的小
  8. 海洋分享lol皮肤插件_LOL手游:能否火起来,梦泪测试后给出评价,网友:说的太真实了...
  9. 云计算技术 — 混合云
  10. 使用MLX90640自制红外热像仪(四):stm32f103c8t6刷320x240分辨率屏的时间测试