Android Fragment切换导致定时器闪退:如何避免TimerTask重复调度?

Android Fragment切换导致定时器闪退:如何避免TimerTask重复调度?

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
喜欢就支持一下吧
点赞14 分享