如何实现每天零点将水平ProgressBar重置为0,现有方案无反应该如何解决
现有实现错误说明
- 存在语法问题无法正常编译:变量
counter重复声明类型、Progressbar类名大小写错误、progressbar.setProgress(counter)语句缺失结束分号。 - 逻辑触发机制错误:时间判断代码仅在
onCreate生命周期执行一次,只有精准在23:59:59那一秒打开Activity才会触发重置,绝大多数场景下都不会执行到重置逻辑,所以进度条无响应。 - 重置逻辑不完整:即使触发了时间判断,仅重置了ProgressBar进度,未同步重置
counter变量,后续点击按钮会延续之前的计数,进度条会直接跳回之前的数值,等于重置未生效。
可行实现方案
方案1:仅App前台运行时生效(轻量实现)
使用Handler定时任务实现,不需要额外引入依赖,适合仅App处于前台时需要生效的场景。
- 修正变量声明等语法错误
- 计算当前时间到次日0点的时间差,作为首次任务触发的延迟时间
- 任务触发时同步重置
counter变量和ProgressBar进度,之后每隔24小时重复执行一次 - Activity销毁时移除定时任务,避免内存泄漏
核心代码示例:
public class MainActivity extends AppCompatActivity { private TextView textView; private Button btn; // 修正变量声明错误 private int counter = 0; private ProgressBar progressBar; // 定时任务相关 private final Handler resetHandler = new Handler(Looper.getMainLooper()); private final Runnable resetRunnable = new Runnable() { @Override public void run() { // 同步重置计数和进度 counter = 0; textView.setText(String.valueOf(counter)); progressBar.setProgress(0); // 24小时后再次执行 resetHandler.postDelayed(this, 24 * 60 * 60 * 1000); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.txtvw); progressBar = findViewById(R.id.progressbar_Horizontal); progressBar.setMax(10); btn = findViewById(R.id.btn_clc); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { counter++; textView.setText(String.valueOf(counter)); progressBar.setProgress(counter); } }); // 计算到次日0点的延迟时间 Calendar current = Calendar.getInstance(); Calendar nextMidnight = Calendar.getInstance(); nextMidnight.set(Calendar.HOUR_OF_DAY, 0); nextMidnight.set(Calendar.MINUTE, 0); nextMidnight.set(Calendar.SECOND, 0); nextMidnight.set(Calendar.MILLISECOND, 0); nextMidnight.add(Calendar.DATE, 1); long delay = nextMidnight.getTimeInMillis() - current.getTimeInMillis(); // 提交定时任务 resetHandler.postDelayed(resetRunnable, delay); } @Override protected void onDestroy() { super.onDestroy(); // 移除任务避免内存泄漏 resetHandler.removeCallbacks(resetRunnable); } }
方案2:App退后台仍可生效
如果需要App关闭后到点也能执行重置逻辑,可使用Jetpack的WorkManager组件实现:
- 自定义Worker类实现重置逻辑,通过本地广播将重置事件通知给前台Activity
- 构建周期为24小时的定时任务,设置首次执行时间为次日0点,提交给WorkManager托管
- Activity注册广播接收器,收到重置事件后同步更新计数器和进度条即可,适配全安卓版本,稳定性优于旧版的AlarmManager、JobScheduler等API。
内容的提问来源于stack exchange,提问作者priyadarshan nadar
相关产品推荐
相关产品推荐

