在使用 MediaPlayer 實作播放/停止功能時,若直接在停止按鈕中呼叫 stop() 後緊接著 release(),但播放執行緒中的 Runnable 仍嘗試呼叫 getCurrentPosition(),會導致非法狀態異常而崩潰。
case R.id.widget31: // RESET
mHandler.post(new Runnable() { ... }); // 更新 UI
mPlayer.stop();
mPlayer.release();
break;
必須先移除 Handler 中的 Runnable,確保播放執行緒不再存取已釋放的 MediaPlayer:
case R.id.widget31: // RESET
mHandler.removeCallbacksAndMessages(null); // 停止所有排程任務
mPlayer.stop();
mPlayer.release();
mPlayer = null; // 避免後續誤用
break;
mPlayer != null 且 !mPlayer.isPlaying()。setOnCompletionListener 釋放資源而非手動管理。onDestroy() 統一釋放。遵循上述順序,即可避免停止播放時的強制關閉錯誤。