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 分享