handler.postdelayed() 毫秒后自动更改 activity onResume()

handler.postdelayed() milliseconds automatically changes after activity onResume()

我在我的应用程序中使用简单的进度条 handler.postdelayed 来更改栏值(恒定时间)并且初始栏值是 100。

Handler progress_handler;
Runnable runnable;
ProgressBar bar;
int progress;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bar= (ProgressBar) findViewById(R.id.progressBar);
    progressBar();
}

private void progressBar()
{
    progress_handler = new Handler();
    runnable = new Runnable()
    {
        @Override
        public void run() {

            progress=bar.getProgress();
            if(progress<=0)
            {
                progress_handler.removeCallbacks(runnable);

            }
            else {
                bar.setProgress(progress - 1);
                progress_handler.postDelayed(runnable, 50); // 50 milliseconds here 

            }
        }
    };
    // Start the Runnable immediately
    progress_handler.post(runnable);

}

这是完美的,但当我暂停并恢复 activity

时出现问题
 @Override
protected void onPause() {
    super.onPause();
    progress_handler.removeCallbacks(runnable);
}

protected void onResume() {
    super.onResume();
    progress_handler.post(runnable);
}

现在进度条速度不是我设置的 50 毫秒了..发生了什么事?

如果你想让你的进度不断减少,你需要使用 Timer 而不是 Handler

Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

其中 task 基本上是您的 Runnable

您可以在 onCreate 中创建所有内容,并在 activity 的 onResume() 中调用 scheduleAtFixedRate 并在 onPause 中调用 cancel

但是,这会在后台线程上运行您的代码,因此您需要一个处理程序来处理 UI 线程上的 post 数据,或者使用 [=37= 的 runOnUiThread ].

另一种选择是使用 Android 的 CountDownTimer

第三种选择是在 onCreate 中删除对 handler.post 的额外调用,只在 onResume

中保留一个