关于Handler的一些思考

Handler.post引发的思考 前几天突然发现修改后的app运行起来很卡顿,使用Android studio的Profile也看不出个所以然来,于是对比了一下前面版本的代码,发现问题所在: mNaviHandler.postDelayed(mRecThread, 5000); mRecThread是一个一直在后台运行的线程,本来是想让其启动延迟一些(因为有些线程需要跑在前面),与是利用现存的handler给它postdelay... 阅读详情

关于Handler的一些思考

1.在子线程中可以创建handler吗?

答案是可以的

//错误示例
	new Thread(){
            @Override
            public void run() {
                new Handler(){
                    @Override
                    public void handleMessage(@NonNull Message msg) {
                        super.handleMessage(msg);

                    }
                };
                
            }
        }.start();

如果按上述方法直接创建Handler,会报运行时错误
在子线程内不能直接创建Handler,创建之前需要调用Looper.prepare()

为什么会抛这个异常呢?
看下Handler源码
源码
handler的空构造函数中调用handler的有参构造函数,第一行代码

//获取当前线程的looper
mLooper = Looper.myLooper();

就是从Looper中获取当前线程的Looper,接着判断当前线程的Looper是否为空,如果为空,就上面的抛出异常。
回到这个问题,那我们在子线程又该如何正确的创建handler呢,其实很简单,就如异常信息所提示的,在当前线程创建handler之前需要初始化当前线程的looper,即Looper.prepare()。无论是主线程还是子线程的Looper创建,都是通过Looper的prepare()函数创建的,我们看下prepare函数的源码
在这里插入图片描述
子线程一般调用的是Looper.prepare(),prepare()里面调用 p r e p a r e ( t r u e ) \color{#FF0000}{prepare(true)} prepare(true) ,主线程调用的是prepareMainLooper,里面是调用 p r e p a r e ( f a l s e ) \color{#FF0000}{prepare(false)} prepare(false) ,我们注意到,他们都是调用了prepare(allowQuit)有参函数,这个参数是什么意思呢?true表示允许退出,所以当不需要这个线程的时候可以调用Looper的quit()函数,false则代表不允许退出.
另外需要注意的是,在prepare()和prepareMianLooper()函数中,都会判断当前线程是否已经存在looper对象,如果已经存在了,会抛出异常, 每 个 线 程 只 允 许 有 一 个 L o o p e r \color{#FF0000}每个线程只允许有一个Looper 每个线程只允许有一个Looper
我们看下创建Looper的源码:
在这里插入图片描述
创建MessageQueue,在messageQueue中保存quitAllowed参数,并在Native层执行初始化操作nativeInit()。
在这里插入图片描述
在这里插入图片描述

2.主线程的Looper与主线程的Looper有什么区别

区别:

  • 主线程的Looper是不可以退出的(在prepare的时候传的quiteAllowed是false,子线程传的是false),子线程的looper是可以退出的,调用looper.quit()即可
  • 子线程的looper需要自己去调用prepare(),而主线程的Looper在进程启动的时候就已经自动创建好了

3.Looper和MessageQueue有什么关系

在java层,looper与messageQueue是一对一的关系,在创建looper对象的时候就会创建messageQueue对象,在创建messageQueue的时候,会调用native层的nativeinit,对native层的looper和messageQueue进行初始化

4.MessageQueue是如何创建的?

在java层创建Looper对象的时候会创建messageq的java对象,而在创建messageQueue的java对象时,又会调用native层的nativeinit,创建native层的looper和messageQueue

Systick中断函数SysTick_Handler的实现引发的思考 SysTick_Handler(void)这个定时器中断处理函数是怎么定义的?根据以往的经验,我感觉在底层应该会有一个类似于函数声明的东西的存在,但是往下跟程序的话,一直都没有找到相应的定义或者声明,那么究竟SysTick_Handler这个函数怎么来的呢?是不是可以人为的做修改呢?以及Systick的详细介绍 阅读详情

相关推荐

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 787

Handler的一些思考

为什么不能在子线程创建Handler 为什么主线程创建 Handler()不会报错 为什么只能在主线程中操作UI?为什么子线程中TextView setText不报错?

旧时光っ 572

RIGOL DS1102E示波器新手必看:从开机到捕获第一个波形的5分钟指南

本文为RIGOL DS1102E示波器新手提供了一份快速上手指南。内容涵盖从开机、探头校准到捕获第一个波形的完整流程,重点解析了触发设置、自动测量等核心操作,并指出了探头衰减比设置等常见误区,帮助用户快速掌握这款经典数字示波器的基本使用方法。

dream的博客 739

由Handler引发的思考

    先说一下,这个问题,我自己花了一晚上去思考这个问题,起源于大家都耳熟能详的Handler在Activity容易导致内存泄漏,我相信大家都知道,但是这里面的细致原因,却之前自己没有深究,所以写一下这篇博客,记录一下自己的思考。 Handler导致内存泄漏 我们都知道Handler因为持有外部Activity引用导致了,Activity的无法释放,但是...

forestzhu的博客 525

【硬件相关】IB网与以太网核心技术解析及高性能网络部署指南

本文深入解析了IB网与以太网的核心技术差异,包括协议栈、流量控制机制及硬件架构,并提供了高性能网络部署的实战指南。通过对比测试和调优案例,展示了IB网在低延迟和高负载下的优势,以及混合组网中的创新应用,助力超算集群和高效网络部署。

weixin_29311017的博客 99

有限差分法地震数据正演模拟(二)

正演模拟,是在地球物理勘探研究中,根据地质体的形状、产状和物性数据,通过构造数学模型计算得到其理论值(数学模拟),或通过构造实体模型来观测模型所产生的地球物理效应的数值(物理模拟)。p(t+1,x,z)即为下一时刻的波长信息,该波动方程的意义就是通过前一时刻(p(t-1,x,z))和现在时刻(p(t,x,z))预测下一时刻波的传播情况。声波波动方程:反应声波的传播规律,描述最简单的波现象的方程,p代表波场信息,v表示速度场信息因为速度只与速度场有关,所以只与x,z有关。其结果也可以作为反演的验证。

weixin_46285501的博客 3935

看Handler后的思考

Android的Handler实现线程通信基本就是通过对象线程共享的这个特性实现的。

m0_62058999的博客 366

游程理论提取灾害事件特征V2---基于MATLAB语言的编程实现

游程理论,灾害事件,MATLAB

EWBA_GIS_RS_ER的博客 3792

Handler的一些认识和思考

Handler作用: 线程之间切换的转换工具,安卓中主要作用是将子线程切换到UI线程,避免UI线程做耗时操作出现ANR Handler代码架构: Handler本身只负责发送和接收消息,在activity启动的时候创建一个loop,背后是一个MessageQueue管理着Message,而Looper循环主体,负责监听Message变化,从MessageQueue取出消息,然后向Handle...

Aiden-Y 243

RK356X linux系统移植RTL8723BU模块遇到的坑

RK356X linux系统移植RTL8723BU模块遇到的坑

目前从事linux驱动开发,多交流多学习吧 954

DevExpress中使用BandGridView实现复合(多行)表头、设置多行表头背景颜色、表格边框颜色

一、实现效果 二、 实现方法 2.1、创建复合表头 ①将创建的GridControl下的GirdView1转化为BandGridView类型; ②创建需要展示的列(指定列的名称【Name】、描述【caption】、数据字段名称【FieldName】) ③绑定列实现复合表头。 注意:如果复合表头有多行,则需要设置新增Band的Row Count,然后设置【Band properties下的AutoFillDown=false】 详细操作如下: 注意:如果要隐藏表格的设计字段内容,则需.

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2893

Handler 从使用到源码探索的思考

当插入的 msg 的 when 相等时,插入顺序是怎样的?next() 的休眠阻塞是怎么回事?唤醒是怎么回事?出现什么情况时唤醒?为什么要唤醒?消息不一定在指定的 when 时刻被分发处理,什么原因?

hqnyl_916的博客 822

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android-Handler的一些思考

当我们使用Handler的时候,习惯于这样写 private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { }; }; 在Lint检查时会有这样的警告: This Handler class should be static or leaks might o

姜澜很懒的专栏 491

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android中关于Handler的若干思考

本文包括与Handler有关的以下问题:   (1)Handler的作用   (2)为什么Android中要设计为只能在UI线程中去更新UI呢?   (3)Handler的两个异常   (4)Handler、Looper MessageQueue之间的关系(源码角度)   (5)跟线程相关的Handler,即HandlerThread(源码角度分析)   (6)主线程往子线程...

107

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 线程的思考 与 Handler

一、组件和线程有什么关系? 组建运行在进程中,运行于哪个进程中由清单文件控制。组件元素——、、、,都有一个process属性可以指定组件运行在哪个进程中。 所有的组件都在特定进程的主线程中实例化。 报告用用户的行为 & 生命周期通知(即UI线程),总是运行在进程的主线程中。 二、线程默认没有消息循环,线程间如何通信? 通过Looper(线程魔法师)类,与Handler(异步处理大师)类在线

Hi 445

Android消息机制中Handler切换线程的思考

对Handler通信机制的原理解析

Franous的博客 1956

android中Handler、Thread、Runnable更新UI的思考

关于Thread、runnable、handler更新UI的一些问题的分析~ 在写一个小应用的时候,我接触到了一个关于Handler和Thread以及runnable的问题,问了群里各种人都解决不了,然后查阅大量资料,终于有些了解,现在发上来和大家分享。

fight for you 1599

站在设计者的角度去思考和学习Handler机制

尝试站在设计者的角度去思考和学习Handler机制

Tank_Mao的博客 3123

【内存泄露】由Handler引发的内存泄漏的思考

前面Looper与Handler解析提到过下面这段代码会出现内存泄漏,其实在Android Studio中会提示这个问题: 在编辑器里面会自动将这段代码标出来,我们看看提示信息是什么?This Handler class should be static or leaks might occur (null) less... (Ctrl+F1) Since this Handler is d

欢迎关注微信公众号:DroidMind 4270

Keil5进入HardFault_Handler 中断问题的思考

Keil5进入HardFault_Handler中断的问题 源程序来源于STM32F103CBT6,现在修改到STM32F103RCT6,因为芯片从MD变化到HD大容量产品了,所以更改了.s文件。 在程序运行调试过程成,在运行一下后死机,进入HardFault_Handler。 通过设置断点,发现使用了Vsprintf标准输入输出函数后,进入HardFault_Handler,怀疑内存溢出。 将Heap Size调整为 400H, 问题解决。 或者 改变StackSize为600H,问题也能解决。其

weixin_42094842的博客 3125

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 42
上一篇: 常用通讯协议简述
下一篇: Android线程间的消息传递机制
Alrict
博客等级 码龄10年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值