
Android Fragment切换导致定时器异常闪退的解决方案
在Android开发中,使用Fragment管理UI界面非常普遍。然而,Fragment切换与定时器(Timer)结合使用时,容易出现问题。例如,从Fragment A切换到Fragment B,再返回Fragment A,程序可能因“任务已调度或取消”错误而崩溃。本文分析此问题并提供解决方案。
问题:开发者在Fragment的onStart方法中启动定时器,在onStop方法中取消定时器。代码如下:
@Overridepublic void onStart() { super.onStart(); timer.schedule(task, 0, 10000);}@Overridepublic void onStop() { super.onStop(); timer.cancel();}
返回Fragment时,程序崩溃,报错“任务已调度或取消”。即使在onStart中重新创建Timer对象,问题依旧:
@Overridepublic void onStart() { super.onStart(); timer = new Timer(); timer.schedule(task, 0, 10000);}
原因:TimerTask对象只能被同一个Timer对象调度一次。第一次切换Fragment时,onStop取消了任务,但Timer对象仍然存在。再次进入Fragment时,onStart试图用同一个Timer调度同一个task,导致异常。
解决方案:关键在于每次都重新创建TimerTask对象(task),而不是Timer对象。每次进入onStart方法,都创建一个新的TimerTask实例,并提交给Timer调度。
改进后的代码示例:
private Timer timer;private TimerTask task;@Overridepublic void onStart() { super.onStart(); timer = new Timer(); task = new TimerTask() { @Override public void run() { // 定时任务代码 } }; timer.schedule(task, 0, 10000);}@Overridepublic void onStop() { super.onStop(); if (timer != null) { timer.cancel(); timer = null; task = null; // Also cancel the task }}
通过重新创建TimerTask,避免了重复调度同一个任务,从而解决了Fragment切换导致定时器闪退的问题。 记住在onStop中也释放task对象,确保资源的完全释放。
以上就是Android Fragment切换导致定时器闪退:如何避免TimerTask重复调度?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/173959.html
微信扫一扫
支付宝扫一扫