【转】Android中removeCallbacks失效原因
2016-06-15 09:47
1216 查看
原文网址:http://blog.sina.com.cn/s/blog_6714fba70100wtx1.html
在Android开发中会使用Handle的removeCallbacks函数,该函数功能为:
但实际工作中有时会出现removeCallbacks无效,解决它。
图:两个按钮,一个将Runnable加到消息队列中,一个将Runnable从消息队列中移除。该Runnable每3秒钟打印一次日志。
码:
结果:
(1)start –> 输出 –> end –> 停止输出
(2)start –> 输出 –> BackGround –> Front –> 继续输出
当Activity进入后台运行后再转入前台运行,removeCallbacks无法将updateThread从message queue中移除。
这是为什么呢?
在Activity由前台转后台过程中,线程是一直在运行的,但是当Activity转入前台时会重新定义Runnable updateThread;也就是说此时从message queue移除的updateThread与原先加入message queue中的updateThread并非是同一个对象。如果把updateThread定义为静态的则removeCallbacks不会失效,如图:
此时,post,postDelayed,removeCallback面对的是同一个handler,updateThread,因此能够实现remove。
这个原因即使是正确的也是表面原因,具体原因需要深入底层机制去了解,求解中。。。
在Android开发中会使用Handle的removeCallbacks函数,该函数功能为:
但实际工作中有时会出现removeCallbacks无效,解决它。
图:两个按钮,一个将Runnable加到消息队列中,一个将Runnable从消息队列中移除。该Runnable每3秒钟打印一次日志。
码:
结果:
(1)start –> 输出 –> end –> 停止输出
(2)start –> 输出 –> BackGround –> Front –> 继续输出
当Activity进入后台运行后再转入前台运行,removeCallbacks无法将updateThread从message queue中移除。
这是为什么呢?
在Activity由前台转后台过程中,线程是一直在运行的,但是当Activity转入前台时会重新定义Runnable updateThread;也就是说此时从message queue移除的updateThread与原先加入message queue中的updateThread并非是同一个对象。如果把updateThread定义为静态的则removeCallbacks不会失效,如图:
此时,post,postDelayed,removeCallback面对的是同一个handler,updateThread,因此能够实现remove。
这个原因即使是正确的也是表面原因,具体原因需要深入底层机制去了解,求解中。。。
相关文章推荐
- android应用程序的启动流程
- android之两种设置全屏或者无标题的方法
- Android入门--Spinner 与setDropDownViewResource自定义下拉菜单
- android保留两位小数
- Android中实现全屏、无标题栏,中途去掉标题
- NDK r9d版本下载
- Android基于讯飞语音SDK实现语音识别
- Android关于AndroidManifest.xml详细分析
- Android之Service(一):服务简介
- Android获取当前时间与星期几
- 关于转义字符
- Android 字符串截取替换函数
- Android 常用知识总结
- Android 服务消息侦听
- Android_eclispe的单词提示
- Android之Activity(一):活动简介
- Mac配置Groovy开发环境
- Android Studio打包全攻略---从入门到精通
- 电脑通过vnc控制android 手机
- Android 6.0 运行时权限检测