在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();
}

}

转载于:https://www.cnblogs.com/zhaoleigege/p/5477352.html

Android更新主线程UI的两种方式handler与runOnUiThread()相关推荐

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

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

  2. Android 子线程更新主线程UI视图

    消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.在Android开发中,子线程不能更新主线程UI,而主线程又不能进行耗时操作(例:网络请 ...

  3. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...

  4. Java面试题:线程实现的两种方式及匿名内部类实现

    QUESTION:线程实现的两种方式及匿名内部类实现 ANSWER: 1.多线程两种实现方式 (1)继承Thread     * 定义类继承Thread     * 重写run方法     * 把新线 ...

  5. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  6. Android 实现图片的高斯模糊(两种方式)

    做项目时遇到要做图片模糊的需求,和微信语音通话的背景效果一样.网上有很多不错的博客,记录一下使用的两种方式. 1. 先来看看第一种,博客原文 首先创建一个工具类 /*** 快速模糊化工具*/ publ ...

  7. Android加载GIF图片的两种方式

    飞哥语录:得到一件东西最好的方式是让自己配得上它. 方式一:使用第三开源框架直接在布局文件中加载gif 1.在工程的build.gradle中添加如下 buildscript {repositorie ...

  8. 主副路由器的两种方式

    今天发现通过路由器连接的硬件设备IP很不稳定,认真对主副路由器两种方式连接进行了分析,核心思想如下: 主路由器LAN口-副路由器WAN口:相当于路由器的扩展 主路由器LAN口-副路由器LAN口:相当于 ...

  9. Android中模拟点击的两种方式

    目前这两种方式,后面有的再继续添加. 1.当我们知道View的时候可以采用 view. performClick()方法 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件) 2.点击也就是相当于 ...

  10. Android 调用系统api录音的两种方式(MediaRecorder、AudioRecord)

    废话 权限.权限.权限,必须要先获取了录音权限,其他的事情晚点再说. 另外,新版本的Android 10系统会对录音有调整,引入了一个录音焦点的概念,也就是说以前的麦克风只能一个APP使用,必须要等它 ...

最新文章

  1. android窗口管理机制
  2. iOS开发debug集锦
  3. [PaaS] 深入 Cloud Foundry(一)构架 (转载)
  4. linux系统被***后处理经历
  5. boost::function_types::has_property_tag用法的测试程序
  6. php fckeditor demo,如何使用PHP添加fckeditor
  7. linux 虚拟机设置好固定ip 修改了 dns 网络需要设置成桥接模式
  8. 辗转相除求最大公约数,最大公倍数
  9. linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用
  10. catkin_make和cmake
  11. 一种基于flex的可视化多层流量切分界面的实现
  12. 216.组合总和III
  13. 【C语言】16-预处理指令2-条件编译
  14. python部署阿里云_python部署到阿里云
  15. 易语言解析html换行,HTML代码查看工具易语言源码
  16. Pearson相关系数, Spearman相关系数,Kendall相关系数的区别
  17. win7删除桌面计算机图标怎么删除,Windows7电脑桌面ie图标怎么删除不了?
  18. Servlet学习笔记
  19. 全面认识当前市面99%的大数据技术框架(附:各大厂大数据技术应用文章)
  20. 腾讯IM实战:低代码超快实现即时通讯录

热门文章

  1. 程序员面对分歧和难题应当具备的态度
  2. 智能优化算法:鸟群算法-附代码
  3. 【LeetCode】【字符串】题号:*8. 字符串转换整数 (atoi)
  4. GEE学习总结(2)——点矢量绘制与坐标系问题
  5. Python学习总结(2)——变量
  6. 实现UncaughtExceptionHandler来实现获取应用全局的crash信息
  7. flutter android 权限,Flutter permission_handler 权限插件的使用详解
  8. mysql dbf导入数据库_MySQL数据库如何导入dbf格式数据?
  9. State Processor API:如何读取,写入和修改 Flink 应用程序的状态
  10. 7 分钟了解 eBay Flink 服务的端到端管理