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