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的详细用法相关推荐

  1. Android命令行工具logcat详细用法!

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明!      本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB ...

  2. Handle类的用法

    android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...

  3. __declspec关键字详细用法

    __declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...

  4. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

  5. python sort怎么用,Linux Sort命令详细用法(有实例)

    Linux Sort命令详细用法(有实例) sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! Linux sort命令进阶: 1 sort的工作原理 so ...

  6. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn

    vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn 原创ChrisWang_ 最后发布于2019-05-24 10:25:58 阅读数 1332  收藏 展开 vue性 ...

  7. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法

    嘿嘿,今天在论坛里看了一篇帖子,讨论ltrim() 函数的详细用法,下面我借几个高手的回答总结一下: 先看几个实例: SQL> select ltrim('109224323','109') f ...

  8. pythonrange函数用法_python range()函数详细用法

    python range()函数详细用法 函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range( ...

  9. python中3 and not 5_python中not、and和or的优先级与详细用法介绍

    前言 (小白专用)本次所分享的是Python中的not.and.or的执行时的优先级,以及他们的具体用法.本文比较详细,不喜勿喷. 一.not.and.or的含义以及优先级 对象 返回结果 优先顺序 ...

最新文章

  1. 如何使用Nsight System?
  2. 在CentOS 6.5 x86_64上安装libunwind的问题
  3. 比较经典的三层交换机实验
  4. C#编程(四十四)----------string和stringbuilder
  5. 江湖召集:.NET开发者们看过来,这场长沙的开发者技术大会正是为你精心准备的大餐...
  6. payara 创建 集群_高可用性(HA),会话复制,多VM Payara群集
  7. HTML5本地图片裁剪并上传
  8. silverlight 不可
  9. vs debug 调试 快捷键
  10. coreseek mysql.sock_Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
  11. Win11如何获得最佳电源效率?
  12. 后flash时代的何去何从
  13. 分享一款实用的太阳能充电电路(室内光照可用)
  14. C# WPF MVVM 实战 - 2.1
  15. linux 2.6.28.7 各驱动代码位置(待验证,已验证为蓝色标识)
  16. K8s------Metallb实现Load Balancer服务
  17. PYGAME - Event 事件
  18. VS2022的下载和使用
  19. Java17线程进程
  20. libevent入门教程:Echo Server based on libevent - Blog of Felix021 - 日,泯然众人矣。

热门文章

  1. 奇异值分解究竟是个啥,该如何理解
  2. 【浙江大学C小程week2整理】
  3. $http与ajax的同步请求
  4. OpenGL十二讲代码
  5. matlab 区域生长算法生成二值图像边界区域
  6. linux下无线网卡测试,Linux C程序如何检测WIFI无线USB网卡是否可用?
  7. svn提交代码报错:A conflict in the working copy obstructs the current operation,解决办法
  8. Go基础(7)-golang面向对象三大特征(封装,继承,多态)
  9. Nginx配置详情-配置说明-参数优化(一)
  10. 中国最好的职业TOP10