Android更新Ui的几种方法
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的几种方法相关推荐
- Android 更新UI的两种方法——handler和runOnUiThread()
Android 更新UI的两种方法--handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外 ...
- 【转】探讨android更新UI的几种方法----不错
原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
- 安卓更新UI的几种方法
安卓更新UI的几种方法: 1.利用Looper更新UI界面 如果我们的代码需要随时将处理后的数据交给UI更新,那么我们想到的方法就是另开一个线程更新数据(也必须这么做,如果我们的数据更新运算量较大 ...
- android ui 最新教程,Android更新UI的五种方式,androidui五种
Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...
- [Android开发]Android更新UI的五种方式
Android更新UI的五种方式: 1.handler.post 2.activity.runOnUiThread 3.view.post 4.handler+Thread 5.AsyncTask 下 ...
- Android子线程中更新UI的4种方法
方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...
- Android非UI线程更新UI的几种方法
2019独角兽企业重金招聘Python工程师标准>>> Android用于实现非UI线程与UI线程的交互方法如下: 1.Handler 2.Activity.runOnUIThrea ...
- Android 更新UI的几种方式
1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { ...
- android更新UI(界面)的方法;android刷新界面数据的方法;android定时器更新界面
Android中常常需要对UI界面进行更新.下面我将介绍的是定时更新UI的几种方法: 一.定时器更新UI的两种方法 1.使用Timer的方式 private Timer timer=new Timer ...
最新文章
- R2LIVE: 一个鲁棒实时的雷达-惯导-视觉紧耦合的位姿估计和建图系统
- Controller 层实现
- linux tcp重传多会导致软中断在各个核很不均匀么?
- 10分钟教你看懂mongodb的npm包
- Linux:mkdir 创建多级目录
- 用包管理python代码,提高开发效率
- ​十大骨传导耳机品牌,骨传导耳机推荐跑步用
- MySQL调用存储过程和函数
- lingix系统安装服务器,安装ngix
- IIS发布网站及网页显示设置
- vue 点击展开显示更多 点击收起部分隐藏
- 微信支付生成签名和验签SDK源码分析
- 国内网友设计诺基亚Lumia 930概念机
- 陕西国防 c语言第三章实训三答案,C语言程序设计实验指导
- uniapp uview-ui退出登录后重新登录token不是最新的解决方案
- Macbook 安装Android Studio以及解决卡顿问题
- 如何在ST官网和keil官网下载相关资料(外设库和芯片器件库)
- 资料员培训建筑八大员培训建筑资料员工程建筑资料与施工管理
- OpenCV 无法解析的外部符号 __imp_opj_image_destroy解决方案
- c++主函数中调用类内函数的方法
热门文章
- 分享Silverlight/WPF/Windows Phone一周学习导读(07月18日-07月24日)
- Kudu command tools
- 《Spark大数据分析实战》——1.4节弹性分布式数据集
- mac apache 和 nginx ssl 配置自签名的SSL
- diamond types are not supported at this language level
- Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学
- deepin linux 大小,关于安装Deepin 20系统选择全盘安装后硬盘容量比实际的小
- 海洋分享lol皮肤插件_LOL手游:能否火起来,梦泪测试后给出评价,网友:说的太真实了...
- 云计算技术 — 混合云
- 使用MLX90640自制红外热像仪(四):stm32f103c8t6刷320x240分辨率屏的时间测试