Android开发:如何终止指定函数?附相关业务代码片段
嘿,我来帮你搞定Android里停止函数的问题~从你的代码片段来看,countSec()应该是个负责计时的函数——毕竟你用到了timer_sec数组跟踪秒数。要停止这类函数,核心得看它内部的实现逻辑,我给你梳理几种最常见的场景和对应的停止方案:
在Android中停止计时函数(以你的
countSec()为例) 1. 如果countSec()用Timer+TimerTask实现计时
这种情况需要把Timer和TimerTask设为Activity的成员变量,这样才能在外部调用取消方法:
// 在MainActivity的成员变量区声明 private Timer mTimer; private TimerTask mTimerTask; // 重写你的countSec()方法 private void countSec() { mTimer = new Timer(); mTimerTask = new TimerTask() { @Override public void run() { // 这里写你的计时逻辑,比如更新timer_sec数组 runOnUiThread(() -> { timer_sec[0]++; }); } }; // 每隔1秒执行一次计时任务 mTimer.scheduleAtFixedRate(mTimerTask, 0, 1000); } // 专门的停止方法 private void stopCountSec() { if (mTimerTask != null) { mTimerTask.cancel(); } if (mTimer != null) { mTimer.cancel(); mTimer.purge(); // 清除已取消的任务,避免内存占用 } }
你可以在需要停止的地方调用stopCountSec(),比如页面销毁时(记得在onDestroy()里调用,防止内存泄漏),或者当isNormal切换回"0"的时候。
2. 如果countSec()用Handler+Runnable实现
这种方式更适合主线程的轻量计时,停止的关键是移除未执行的回调:
// 成员变量区 private Handler mHandler = new Handler(Looper.getMainLooper()); private Runnable mCountRunnable; private void countSec() { mCountRunnable = new Runnable() { @Override public void run() { timer_sec[0]++; // 循环执行,每隔1秒调用自己 mHandler.postDelayed(this, 1000); } }; // 启动计时 mHandler.post(mCountRunnable); } private void stopCountSec() { if (mCountRunnable != null) { mHandler.removeCallbacks(mCountRunnable); } }
同样,在onDestroy()里一定要调用stopCountSec(),避免Handler持有Activity引用导致内存泄漏。
3. 如果是Kotlin项目用协程实现
如果你的项目是Kotlin,用协程控制启停会更优雅:
// 成员变量 private var countJob: Job? = null private fun countSec() { countJob = lifecycleScope.launch { while (isActive) { // isActive是协程的活跃状态标记 timer_sec[0]++ delay(1000) } } } private fun stopCountSec() { countJob?.cancel() }
结合你的代码逻辑的小建议
从你的switch-case来看,当isNormal为"1"时启动计时,那切换到其他状态时,记得先停止计时并重置秒数,避免下次启动计数出错:
switch (isNormal) { case "0": stopCountSec(); // 停止计时 timer_sec[0] = 0; // 重置秒数 imageView.setImageResource(R.drawable.mygreen); break; case "1": stopCountSec(); // 先停掉之前的计时,再启动新的 countSec(); int t = timer_sec[0]; if (t > 5) { imageView.setImageResource(R.drawable.myred); } else { imageView.setImageResource(R.drawable.mygreen); } break; default: stopCountSec(); timer_sec[0] = 0; imageView.setImageResource(R.drawable.mywhite); Toast.makeText(MainActivity.this, "enter 0 or 1", Toast.LENGTH_SHORT).show(); break; }
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

