【问题标题】:How to update TextView with CountdownTimer onResume?如何使用 CountdownTimer onResume 更新 TextView?
【发布时间】:2016-08-22 20:13:50
【问题描述】:

我想使用倒数计时器,但遇到了问题。如果我启动它然后按下后退按钮(将生命周期更改为 onStop)并返回活动 - 我无法在 TextView 中看到计时器值。但在 Logcat 中,我看到计时器有效。

问题:如何在活动返回后更新TextView(onResume)

更新。 虽然我不会关闭活动,但此代码可以正常工作 - 很好。但是如果我按下后退按钮,TextView 中没有值。 定时器方法代码(该方法从onCreate调用):

timer = new CountDownTimer(rest + 1000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                secondsUntilFinish = Math.round(millisUntilFinished / 1000);
                String minutes = String.format("%02d",TimeUnit.SECONDS.toMinutes(secondsUntilFinish));
                String seconds = String.format("%02d",TimeUnit.SECONDS.toSeconds(secondsUntilFinish) - TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(secondsUntilFinish)));
                tvRoutineTimer.setText(getResources().getString(R.string.exercise_rest_timer, minutes, seconds));
                Log.d(LOG_TAG, "onTick = " + getResources().getString(R.string.exercise_rest_timer, minutes, seconds));
            }

            @Override
            public void onFinish() {
                tvRoutineProgress.setText(getString(R.string.routine_progress, currentStep, totalSteps));
                tvRoutineTimer.setText(getString(R.string.exercise_rest_timer, "00", "00"));
                notificationAfterRest();
                btnExerciseDone.setText(getString(R.string.button_exercise_done));
                btnExerciseDone.setEnabled(true);
                tvExercisePlaceholder.setText(getString(R.string.exercise_current_title));
            }
        }.start();

【问题讨论】:

  • 如果您发布一些代码,帮助会容易得多。
  • @Pztar,完成。说你是否需要看更多
  • 您在TextView 上看到了什么?旧值还是什么都没有?
  • @Pztar,它向我显示了完成后的最终值。 tvRoutineTimer ("00:00");

标签: android countdowntimer


【解决方案1】:

您需要从 UI 线程更新您的 TextView。像这样更新您的TextView

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvRoutineTimer.setText(getResources().getString(R.string.exercise_rest_timer, minutes, seconds));
        });   

runOnUiThread 放在onTick()

【讨论】:

  • 但是如果我需要每秒显示值,那么频繁调用runOnUiThread方法可以吗?
  • 是的,您所做的只是更新用户界面。 runOnUiThread 是简短的快速回答。使用HandlerRunnable 会更好。
  • 请查看更新后的内容。在第一张照片。计时器运行良好,第二次 - 计时器仅在 Logcat 中显示,但在 UI 中不显示。 runOnUiThread() 方法没有帮助。 *** 在 logcat 中“锻炼活动 onStart() blah blah” 显示返回活动后。正如你可以提到的 - 它会立即跳转到 CountDownTimer 中的 onFinish()
  • 如果我将 Handler 与 Runnable 一起使用,那么每次重新打开活动后都会获得一个具有不同值的新线程
  • CountDownTimer 为构造 CountDownTimer 的线程创建一个与 Looper 关联的 Handler。只要在主线程上构造 CountDownTimer,就保证在主线程上也会调用回调,并且不需要特殊的 runOnUiThread 逻辑。由于原始发布者声明他从 onCreate 创建 CountDownTimer,因此他已经在主线程上调用了回调。
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多