kotlin android Handler removeCallbacks runnable不生效的一种可能

news/2024/11/1 20:14:51/

android Handler无法移除runnable。
比较老的解释就是因为messageQueue已经即将执行的不能被取消,这种我们很好理解它, 因为他已经在跑了,自然无法移掉。
但是在kotlin下有个大坑。

赶快来全局搜索检查你的removeCallbacks吧!

kotlin">    private val connectRunnable = {//...connect()//...}mainHandler.removeCallbacks(connectRunnable)if (status == 133) {postMainHandler(500, connectRunnable)return}if (xxxxx) {if (xxxx) {postMainHandler(15000, connectRunnable)} else {postMainHandler(8000, connectRunnable)}} else {//....}

看着挺正常对吧?这是因为kotlin认为,Runnable等价于 ()->Unit. 坑就这里。它会帮你把()->unit函数转成Runnable传过去。

接下来我们来看看是咋么回事:
Tools-》kotlin-》字节码-》decompile:
请添加图片描述可以看到箭头函数会被编译成Function对象。然后就尴尬了:
请添加图片描述

请添加图片描述
不用我多解释了吧。明白了吧。

kotlin并非专为android设计。编译器把()->unit函数当做了Runnable,一般情况确实是可以通过function和lambda包裹转变。但是,Android Handler移除就要求的是同一个对象。removeCallbacks的Runnable并非你postDelay的runnable。而从IDEA上是看不出来差异的。

所以改成申明为Runnable

    private val connectRunnable = Runnable{xxxx}

我也会上报给google,让它加一个类似的提示:
在这里插入图片描述


http://www.ppmy.cn/news/1543677.html

相关文章

Python3 基础核心语法指南(初级版)

Python 是一门广泛使用的编程语言,适合从小项目到大规模应用开发。本文介绍 Python 的基本语法和一些实用的编程技巧,适合初学者与开发人员。为了方便大家理解,有些例子采用两种写法,一种采用的是英文变量名,另一种则采…

三、k8s快速入门之Kubectl 命令基础操作

⭐️创建Pod [rootmaster ~]# kubectl run nginx --imageharbor.tanc.com/library/ngix:latest kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be rmoved in a future version. Use kubectl run --generatorrun-pod/v1 or kbectl create instead. deplo…

jlink识别不到gd32@

jlink识别不到gd32 SW Device 1、原因可能是jlink硬件HW版本过低,或者PC端jlink工具安装包版本过低; 通过jlink configuration.exe升级HW固件版本; PC端上位机jlink工具版本下载 2、上电默认一些选项导致的低级识别不到 诸如此类的&#xff0…

WPF+MVVM案例实战(九)- 霓虹灯字效果控件封装实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、运行效果2、主菜单与界面实现1、主菜单2、霓虹灯字界面实现3、字体资源获取3、控件封装1.创建自定义控件2、依赖属性实现3、封装控件使用4、运行效果4、源代码获取1、运行效果 2、主菜单与界面实…

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应…

使用 fzf 实现文件快速查找、打开及执行

使用 fzf 实现文件快速查找、打开及执行 本文将介绍如何安装 fzf,配置文件,以便使用 cdf 和 cdd 函数来快速查找、打开、编辑、编译并运行文件或快速进入指定目录。cdf 是一个文件查找和执行工具,cdd 是一个目录查找工具。默认情况下&#x…

JIME智创:抖音创作者的AI绘画与视频生成创作神器

在短视频和社交内容创作的时代,创意和速度成了成功的关键。无论是视频博主、图文创作者还是品牌推广人,他们都面临着如何快速生成高质量图片与视频素材的挑战。JIME智创正是针对这一需求推出的AI创作工具,专为抖音的图文和视频创作者设计&…

go语言中defer用法详解

defer 是 Go 语言中的一个关键字,用于延迟执行某个函数或语句,直到包含它的函数返回时才执行。defer 语句在函数执行结束后(无论是正常返回还是由于 panic 返回)都将执行。 defer 的基本用法 延迟执行: 当你在一个函数…