android Fragment切換引發(fā)定時器異常閃退的有效解決方案
在Android開發(fā)中,F(xiàn)ragment是常用的界面切換組件。然而,F(xiàn)ragment中的定時器若處理不當(dāng),在Fragment切換時容易出現(xiàn)“Task already scheduled or cancelled”錯誤,導(dǎo)致應(yīng)用崩潰。本文針對此問題提供詳細(xì)解決方案。
問題:開發(fā)者在Fragment的onStart()方法中啟動定時器,在onStop()方法中取消定時器。代碼如下:
@Override public void onStart() { super.onStart(); timer.schedule(task, 0, 10000); } @Override public void onStop() { super.onStop(); timer.cancel(); }
當(dāng)返回之前的Fragment時,應(yīng)用閃退并報錯“task already scheduled or cancelled”。即使在onStart()中重新創(chuàng)建timer對象,問題依舊存在:
@Override public void onStart() { super.onStart(); timer = new Timer(); timer.schedule(task, 0, 10000); }
原因分析:TimerTask只能被一個Timer對象調(diào)度一次。即使重新創(chuàng)建Timer,如果之前的TimerTask未被正確取消或釋放,再次調(diào)度就會沖突,引發(fā)異常。
解決方案:在onStart()方法中,重新創(chuàng)建一個TimerTask對象,而不是Timer對象。每次進(jìn)入Fragment時,都應(yīng)創(chuàng)建新的TimerTask執(zhí)行定時任務(wù),避免重復(fù)調(diào)度同一TimerTask導(dǎo)致沖突。 改進(jìn)后的代碼示例如下:
private Timer timer; private TimerTask timerTask; @Override public void onStart() { super.onStart(); timer = new Timer(); timerTask = new TimerTask() { // 定時任務(wù)代碼 }; 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; } }
通過以上改進(jìn),確保每次onStart()都創(chuàng)建新的TimerTask,并在onStop()中徹底釋放資源,有效避免了“Task already scheduled or cancelled”錯誤,提高了應(yīng)用的穩(wěn)定性。