求助:如何实现代码每60秒重复执行(关于postDelayed()函数的使用疑问)
求助:如何实现代码每60秒重复执行(关于postDelayed()函数的使用疑问)
嗨,我来帮你搞定这个定时执行的需求,顺便把postDelayed的用法给你讲明白~
首先,postDelayed是Handler类的核心方法,简单说就是让一段代码延迟指定毫秒数后再执行。要实现每60秒重复执行你的代码,关键是在这段代码执行完之后,再次调用postDelayed,形成一个循环触发的逻辑。
结合你给出的代码,我整理了可直接复用的实现方案:
步骤1:定义全局的Handler和Runnable
在你的MainActivity里定义全局的Handler和Runnable实例(别放在方法里当局部变量,不然容易被系统回收导致任务中途失效):
private Handler mConnectionHandler = new Handler(); private Runnable mConnectionCheckTask = new Runnable() { @Override public void run() { // 这里放你要每60秒执行的连接检查代码 if (App.connection_status == 2) { ConnectionTimer.cancel(); SharedPreferences SharedAppDetails = getSharedPreferences("settings_data", 0); SharedPreferences.Editor Editor = SharedAppDetails.edit(); Editor.putString("connection_time", String.valueOf(App.CountDown)); Editor.apply(); if (App.CountDown >= 20) { SharedPreferences settings = getSharedPreferences("settings_data", 0); String Rate = settings.getString("rate", "false"); if (Rate.equals("false")) { Intent Servers = new Intent(MainActivity.this, ReviewActivity.class); // 这里补上你原来没写完的逻辑,比如启动Activity: // startActivity(Servers); } } } // 重点!执行完当前代码后,再次延迟60秒执行这个任务,形成循环 mConnectionHandler.postDelayed(this, 60 * 1000); // 60秒 = 60*1000毫秒 } };
步骤2:启动定时任务
在合适的时机启动这个循环任务,比如在Activity的onCreate方法里,或者某个用户触发事件(比如按钮点击)里:
// 如果你想立即执行一次,再开始每60秒循环: mConnectionCheckTask.run(); // 先执行一次 mConnectionHandler.postDelayed(mConnectionCheckTask, 60 * 1000); // 之后每60秒执行一次 // 如果你想第一次也延迟60秒再执行,直接调用下面这行就行: // mConnectionHandler.postDelayed(mConnectionCheckTask, 60 * 1000);
步骤3:页面销毁时停止任务(必做!)
为了避免内存泄漏,一定要在Activity销毁的时候移除这个定时任务:
@Override protected void onDestroy() { super.onDestroy(); // 移除所有未执行的回调任务 mConnectionHandler.removeCallbacks(mConnectionCheckTask); }
额外说明
- 全局定义的原因:如果Handler和Runnable是局部变量,当方法执行完后,它们可能会被GC回收,导致定时任务中途停止。
- postDelayed的第二个参数是延迟的毫秒数,所以60秒就要写成
60 * 1000。 - 如果你的需求是当
connection_status不等于2时就停止循环,那可以把postDelayed的调用放到if (App.connection_status == 2)的代码块里,否则保持现在的写法,不管状态如何都继续循环检查。
备注:内容来源于stack exchange,提问作者Kez XI
相关产品推荐
相关产品推荐

