Handle的详细用法
Handler:是一个消息分发对象,进行发送和处理消息,并且其 Runnable 对象与一个线程的 MessageQueue 关联。
作用:调度消息,将一个任务切换到某个指定的线程中去执行。
为什么需要 Handler?
子线程不允许访问 UI
假若子线程允许访问 UI,则在多线程并发访问情况下,会使得 UI 控件处于不可预期的状态。
传统解决办法:加锁,但会使得UI访问逻辑变的复杂,其次降低 UI 访问的效率。
引入 Handler
采用单线程模型处理 UI 操作,通过 Handler 切换到 UI 线程,解决子线程中无法访问 UI 的问题。
Handler 使用
方式一: post(Runnable)
创建一个工作线程,实现 Runnable 接口,实现 run 方法,处理耗时操作。
创建一个 handler,通过 handler.post/postDelay,投递创建的 Runnable,在 run 方法中进行更新 UI 操作。
new Thread(new Runnable() {@Overridepublic void run() {/**耗时操作*/handler.post(new Runnable() {@Overridepublic void run() {/**更新UI*/}});}}).start();
方式二: sendMessage(Message)
创建一个工作线程,继承 Thread,重新 run 方法,处理耗时操作
创建一个 Message 对象,设置 what 标志及数据
通过 sendMessage 进行投递消息
创建一个handler,重写 handleMessage 方法,根据 msg.what 信息判断,接收对应的信息,再在这里更新 UI。
private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) { //判断标志位case 1:/**获取数据,更新UI*/break;}}
};public class WorkThread extends Thread {@Overridepublic void run() {super.run();/**耗时操作*/
//从全局池中返回一个message实例,避免多次创建message(如new Message)Message msg =Message.obtain(); msg.obj = data;msg.what=1; //标志消息的标志handler.sendMessage(msg);}}new WorkThread().start();
Handle的详细用法相关推荐
- Android命令行工具logcat详细用法!
logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明! 本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB ...
- Handle类的用法
android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...
- __declspec关键字详细用法
__declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...
- mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析
MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 ...
- python sort怎么用,Linux Sort命令详细用法(有实例)
Linux Sort命令详细用法(有实例) sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! Linux sort命令进阶: 1 sort的工作原理 so ...
- vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn
vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn 原创ChrisWang_ 最后发布于2019-05-24 10:25:58 阅读数 1332 收藏 展开 vue性 ...
- oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
嘿嘿,今天在论坛里看了一篇帖子,讨论ltrim() 函数的详细用法,下面我借几个高手的回答总结一下: 先看几个实例: SQL> select ltrim('109224323','109') f ...
- pythonrange函数用法_python range()函数详细用法
python range()函数详细用法 函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range( ...
- python中3 and not 5_python中not、and和or的优先级与详细用法介绍
前言 (小白专用)本次所分享的是Python中的not.and.or的执行时的优先级,以及他们的具体用法.本文比较详细,不喜勿喷. 一.not.and.or的含义以及优先级 对象 返回结果 优先顺序 ...
最新文章
- 如何使用Nsight System?
- 在CentOS 6.5 x86_64上安装libunwind的问题
- 比较经典的三层交换机实验
- C#编程(四十四)----------string和stringbuilder
- 江湖召集:.NET开发者们看过来,这场长沙的开发者技术大会正是为你精心准备的大餐...
- payara 创建 集群_高可用性(HA),会话复制,多VM Payara群集
- HTML5本地图片裁剪并上传
- silverlight 不可
- vs debug 调试 快捷键
- coreseek mysql.sock_Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
- Win11如何获得最佳电源效率?
- 后flash时代的何去何从
- 分享一款实用的太阳能充电电路(室内光照可用)
- C# WPF MVVM 实战 - 2.1
- linux 2.6.28.7 各驱动代码位置(待验证,已验证为蓝色标识)
- K8s------Metallb实现Load Balancer服务
- PYGAME - Event 事件
- VS2022的下载和使用
- Java17线程进程
- libevent入门教程:Echo Server based on libevent - Blog of Felix021 - 日,泯然众人矣。