当前位置: 首页 > article >正文

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

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

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

    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.kler.cn/a/382296.html

相关文章:

  • 【蓝桥杯】43688-《Excel地址问题》
  • 前端开放性技术面试—面试题
  • mysql-主从同步与读写分离
  • 秒优科技-供应链管理系统 login/doAction SQL注入漏洞复现
  • 【Spring事务】深入浅出Spring事务从原理到源码
  • electron打包linux环境
  • 033_Structure_Static_In_Matlab求解结构静力学问题两套方法
  • Oracle 第24章:云数据库服务
  • 基于Python的智能旅游推荐系统设计与实现
  • C++练习题(2)
  • VSCode 与 HBuilderX 介绍
  • 新一代Webshell管理器
  • 告别复杂协作:Adobe XD的简化替代方案
  • PLC单键启停控制的多种写法
  • kafka客户端消费者吞吐量优化
  • Spring Boot框架:大学城水电管理自动化
  • Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)
  • 【SQL实战进阶】——视图的定义、使用
  • 外包干了6年,技术退步明显.......
  • 【风力发电】基于Matlab的双馈风力发电机建模仿真设计
  • 【报错解决】
  • 用 Visual Studio Code 打造超越 PyCharm 的开发神器
  • Scala 中的Set
  • Python从入门到高手7.5节-实现冒泡排序算法
  • JUC笔记之ReentrantLock
  • 基础 IO(文件系统 inode 软硬链接)-- 详解