当前位置: 首页> 游戏> 攻略 > 太原网站制作案例_cba最新积分榜_广州seo网站开发_软文案例短篇

太原网站制作案例_cba最新积分榜_广州seo网站开发_软文案例短篇

时间:2025/7/11 15:48:01来源:https://blog.csdn.net/jzlhll123/article/details/143391144 浏览次数:0次
太原网站制作案例_cba最新积分榜_广州seo网站开发_软文案例短篇

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,让它加一个类似的提示:
在这里插入图片描述

关键字:太原网站制作案例_cba最新积分榜_广州seo网站开发_软文案例短篇

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: