android Fragment切换导致定时器异常闪退的解决方案
在Android开发中,使用Fragment管理ui界面非常普遍。然而,Fragment切换与定时器(Timer)结合使用时,容易出现问题。例如,从Fragment A切换到Fragment B,再返回Fragment A,程序可能因“任务已调度或取消”错误而崩溃。本文分析此问题并提供解决方案。
问题:开发者在Fragment的onStart方法中启动定时器,在onStop方法中取消定时器。代码如下:
@Override public void onStart() { super.onStart(); timer.schedule(task, 0, 10000); } @Override public void onStop() { super.onStop(); timer.cancel(); }
返回Fragment时,程序崩溃,报错“任务已调度或取消”。即使在onStart中重新创建Timer对象,问题依旧:
@Override public 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; @Override public void onStart() { super.onStart(); timer = new Timer(); task = new TimerTask() { @Override public void run() { // 定时任务代码 } }; timer.schedule(task, 0, 10000); } @Override public void onStop() { super.onStop(); if (timer != null) { timer.cancel(); timer = null; task = null; // Also cancel the task } }
通过重新创建TimerTask,避免了重复调度同一个任务,从而解决了Fragment切换导致定时器闪退的问题。 记住在onStop中也释放task对象,确保资源的完全释放。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END