android Fragment切換引發定時器異常閃退的有效解決方案
在Android開發中,Fragment是常用的界面切換組件。然而,Fragment中的定時器若處理不當,在Fragment切換時容易出現“Task already scheduled or cancelled”錯誤,導致應用崩潰。本文針對此問題提供詳細解決方案。
問題:開發者在Fragment的onStart()方法中啟動定時器,在onStop()方法中取消定時器。代碼如下:
@Override public void onStart() { super.onStart(); timer.schedule(task, 0, 10000); } @Override public void onStop() { super.onStop(); timer.cancel(); }
當返回之前的Fragment時,應用閃退并報錯“task already scheduled or cancelled”。即使在onStart()中重新創建timer對象,問題依舊存在:
@Override public void onStart() { super.onStart(); timer = new Timer(); timer.schedule(task, 0, 10000); }
原因分析:TimerTask只能被一個Timer對象調度一次。即使重新創建Timer,如果之前的TimerTask未被正確取消或釋放,再次調度就會沖突,引發異常。
解決方案:在onStart()方法中,重新創建一個TimerTask對象,而不是Timer對象。每次進入Fragment時,都應創建新的TimerTask執行定時任務,避免重復調度同一TimerTask導致沖突。 改進后的代碼示例如下:
private Timer timer; private TimerTask timerTask; @Override public void onStart() { super.onStart(); timer = new Timer(); timerTask = new TimerTask() { // 定時任務代碼 }; timer.schedule(timerTask, 0, 10000); } @Override public void onStop() { super.onStop(); if (timer != null) { timer.cancel(); timer = null; } if (timerTask != null) { timerTask.cancel(); timerTask = null; } }
通過以上改進,確保每次onStart()都創建新的TimerTask,并在onStop()中徹底釋放資源,有效避免了“Task already scheduled or cancelled”錯誤,提高了應用的穩定性。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END