Handler的学习

news2024/9/20 15:07:37

一、Handler到底有什么用呢?

首先看以下案例:

public class MainActivity extends AppCompatActivity {
Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn=findViewById(R.id.btn);
    }

    public void btnOnClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //模拟一个网络请求

                try {
                    Thread.sleep(2*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                btn.setText("12345");


            }
        }).start();

    }

}

 可以看到,绑定一个button,点击button后,在异步线程中模拟网络请求,当网络请求结束,改变button上的文字。

结果:

 

 

Only the original thread that created a view hierarchy can touch its views.

只有创建视图层次结构的原始线程才能接触其视图。说明除了主线程,其它线程不能更信UI.

这个案例引出了两个个问题1.为什么在子线程不能更新UI?因为当多个子线程与主线程共同操作UI时,会出现操作不可控的现象。2.如果想要在子线程更新UI怎么办?这就需要用到我们的Handler了。

二、Handler的消息处理机制


1、Handler
Handler在android里负责发送和处理消息,通过它可以实现其他线程与Main线程之间的消息通讯。
2. Looper负责管理线程的消息队列和消息循环
3. Message是线程间通讯的消息载体。两个码头之间运输货物, Message充当集装箱的功能,里面可以存放任何你想要传递的消息。
4.MessageQueue
MessageQueue是消息队列,先进先出,它的作用是保存有待线程处理的滩息。
 

 

 

四者之间的关系是,在其他线程中调用Handler,sendMsg0方法(参数是Message对
象),将需要Main任程处理的事件添加到Main线程的MessageQueue中, Main线程通过
Mainlooper从涨息队列中取出Handler发过来的这个消息时,会回调Handler的
handlerMessage0方法。 

三、在子线程更新UI的四种方法

1.Handler.sendEmptyMessage()方法。

private Handler handler=new Handler(){
    //接收消息,等待处理
    @Override
    public void handleMessage(@NonNull Message msg) {
      switch (msg.what)
      {
          case 1:   btn.setText("12345");break;
          case 2:
              break;


      }
    }
};


    public void btnOnClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //模拟一个网络请求

                try {
                    Thread.sleep(2*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                handler.sendEmptyMessage(1);



            }
        }).start();


    }

 

    public void btnOnClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {

     
     //延时发送
                handler.sendEmptyMessageDelayed(1,2*1000);



            }
        }).start();


    }

 

 

二、通过handler.post方法

        new Thread(new Runnable() {
            @Override
            public void run() {
                //模拟一个网络请求

                try {
                    Thread.sleep(2*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
       
//在子线程里更新UI
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        btn.setText("1234");

                    }
                });




            }
        }).start();

3.通过View.post方法 


                   btn.post(new Runnable() {
                       @Override
                       public void run() {
                           btn.setText("View123");
                       }
                   });

 4.在UI线程更新UI

   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           btn.setText("runOnUiThread");
                       }
                   });

最后, 思考,为什么要 在子线程中更新UI,在直接在主线程更新不可以吗,毕竟,在子线程中更新UI本质还是转到主线程中更新UI。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue这些原理你都知道吗?(面试版)

前言 在之前面试的时候我自己也经常会遇到一些vue原理的问题, 我也总结了下自己的经常的用到的,方便自己学习,今天也给大家分享出来, 欢迎大家一起学习交流, 有更好的方法欢迎评论区指出, 后序我也将持续整理总结~ 描述 Vue 与 React 区别 说明概念: vue:是一套用于构建用户…

虚拟化技术学习笔记3

1、KVM虚拟机管理工具部署 学习目标: 能够为KVM虚拟机管理工具部署准备环境 能够部署KVM虚拟机管理工具 1、KVM系统需求: 1)Host system requirements: 1核心、2G内存、6G硬盘 2)KVM hypervisor requirements: l…

U3D客户端框架(资源管理篇)之主资源加载器模块设计实现

一、主资源加载器模块设计实现 作用 主资源加载器是为面向用户而设计的上层应用层类,用户使用主资源加载器作为文件加载器加载文件, 加载器可以通过Assetbundle方式加载,Http方式加载资源。 UML类图设计 前置模块 主资源加载器需要引用到一…

Qt扫盲-QHash理论总结

QHash理论总结一、概述二、使用1. 添加 元素2. 获取元素3. 遍历元素4. 删除元素5. qHash()的散列函数6.算法复杂性一、概述 QHash是Qt的通用容器类之一。它和QMap一样是用来存储(键,值)对的工具,并提供快速查找与键相关联的值的功能。 QHash提供了与QMa…

密码学的一些常识01

序 作为一个小白,对称加密,非对称加密,数字签名,数字证书,CA,diff-helman,DES,AED,RSA……这些都不会。所以,百度启动,先初步了解。 实际应用 我是个小白……0基础的&…

sklearn中精确率、召回率及F1值得micro,macro及weighted算法

为什么要用精确率和召回率 有这样一个训练集,1000个人参加了结直肠癌CRC的检测,实际有0.5%的人得了CRC(即5个人)。用神经网络算法得到检测这样一个训练集能达到99%的准确率。从数值上判断该算法是不错的,因为只有1%的误…

springboot+disruptor再体验

Disruptor是一个高性能队列,常见的还有kafka、rabbitmq等,下面体验一下~ 1、Disruptor简介 Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的…

[C++]STL之string的模拟实现

上一章我们对string的常见接口及使用进行了讲解,接下来我们将对一些常见的接口,包括构造函数,析构函数,运算符重载等等进行模拟实现.方便我们理解string接口实现的原理. 在讲解之前先说一下string的成员变量. 首先是字符串内容_…

微信小程序picker组件遇到的问题以及解决办法

一、picker基本概念二、遇到的问题三、如何解决四、延伸五、效果图一、picker基本概念 先来看一下官方文档中picker的基本概念: 从底部弹起的滚动选择器,现支持三种选择器,通过mode来区分,分别是普通选择器,时间选择器…

Bochs下载安装

文章目录下载Bochs配置BochsBochs Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的…

【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中会遇到要将场景中的Text的字体全部替换的情况。 所以…

NetInside网络分析帮您解决系统性能问题(一)

前言 某大学信息中心负责人表示,有用户反馈,在通过VPN访问某一IP的80端口时连接时断时续。同时信息中心给到的信息是通过VPN:XXX.XXX.253.5访问IP地址XXX.XXX.130.200的80端口出现访问时断时续问题。 需要通过分析系统看一下实际情况&#…

云原生周刊 | 人类、机器人与 Kubernetes

近日 Grafana 官网发表了一篇博客介绍了 2022 年比较有意思、脑洞大开的一些 Grafana 使用案例,比如监控特斯拉 Model 3 的充电状态、OTA 更新状况等等。 海事技术供应商 Royal IHC 利用 Grafana 展示客户船队的关键性能指标,例如燃料消耗、服务时间、大…

Allegro174版本新功能介绍之打开坐标超链接功能

Allegro174版本新功能介绍之打开坐标超链接功能 Allegro在升级到174的时候默认打开时,报表中的坐标是不带超链接的,如下图 直接点击坐标,是无法自动跳转到坐标所在位置的 但是Allegro174是开放了打开超链接的功能的,具体操作如下 选择Setup选择User Preferences

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第一篇】(持续更新中)

【 Vue3 Vite setup语法糖 Pinia VueRouter Element Plus 第一篇】(持续更新中) 1.使用 Vite脚手架创建 Vue3 项目 终端输入命令 npm create vite 项目名选择 Vue项目并回车根据自己的爱好,选择配置即可 2. 开启 Network 访问地址 npm run dev后 提示 use -…

磨金石教育||商业插画的发展现状如何?学习插画可以月入过万吗?

商业插画是什么?现如今,商业插画已经在生活中随处可见。你买的所有带包装的产品,上面的各种有趣的产品插图,就是插画师做的产品插画。特别是一些零食类的产品,在包装箱上,我们常可以看到各种大眼睛拟人化的…

电脑出现0xc00000e9错误代码的解决方法

每当假期结束回来,经常发现Windows系统的电脑一段时间不开机,开机就出现0xc00000e9的错误代码。为什么明明没有任何操作却出现错误呢?驱动人生带大家一文了解。 出现0xc00000e9错误代码的原因 先来了解一下电脑出现0xc00000e9错误代码的主要…

数字孪生架构

很多同学对数字孪生特别感兴趣,经常有同学问我:数据孪生系统怎么做?有没有教程?除了Unity开发,开发数字孪生还需要掌握什么技能?有人介绍了一个数字孪生的外包,从来没做过,能不能接&…

Spring 中常用的几个工具类

AnnotatedElementUtils 类 获取某个类的某个方法上是否有标注注解,并可以通过其他 API 获取到这个类注解上的属性值,该工具类其他 API 下面截图可以查看。 public static boolean isBeanAnnotated(Method method) {return AnnotatedElementUtils.hasAn…

Redis 应用问题解决

缓存穿透 key 对应的数据在数据源并不存在,每次针对此key的请求从缓存中获取不到,请求会都压到数据源,从而可能压垮数据源。 解决方案 一个一定不存在的缓存及查询不到的数据,由于缓存是不命中时被动写的,并且处于容…