每秒更改TextView中的文本

4
我正在尝试实现以下功能:按下按钮,每1秒在文本视图中显示从1到10的数字。
private void startCounting() {

    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            increaseNumber();
        }
    };

    timer.scheduleAtFixedRate(task, 0, 1000);

}

private void increaseNumber() {
    number++;
    tvFragment.setText(number);
}

我遇到了 CalledFromWrongThreadException 错误。

好的,我知道这是什么,我们不能从后台线程更新 UI 元素,但问题是如何修复它?怎么做呢?

4个回答

5
您可以使用Handler类。
private Handler handler = new Handler();

private void startCounting() {
    handler.post(run);
}

private Runnable run = new Runnable() {
  @Override
  public void run() {
    number++;
    tvFragment.setText(number);
    handler.postDelayed(this, 1000);
  }
};

现在如何停止计数? - androidmanifest
1
要停止执行,请调用handler.removeCallbacks(handler)。 - SergeyBukarev
handler.removeCallbacks(handler);会出错。是不是应该用handler.removeCallbacks(run);? - user8959091
handler.removeCallbacksAndMessages(null); should work. From https://developer.android.com/reference/android/os/Handler#removeCallbacks(java.lang.Runnable). You could also just stop it when it hits some number in the code, with if( number < maxNum ) handler.postDelayed(this, 1000) - Tyler V

0

你可以使用CountDownTimer代替Timer。

    public class MainActivity extends AppCompatActivity {

    TextView tvText;
    private long totalTime = 10000, countDownInterval = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvText = findViewById(R.id.tv_text);
    }

    public void startCounter(View view) {
        CountDownTimer timer = new CountDownTimer(totalTime, countDownInterval) {
            @Override
            public void onTick(long millisUntilFinished) {
                tvText.setText(String.valueOf(millisUntilFinished / 1000));
            }

            @Override
            public void onFinish() {
                tvText.setText("Your time is out.!");
            }
        };
        timer.start();
    }
}

这是你的 XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:onClick="startCounter"
        android:text="@string/start_counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

你可以从这个链接 CountDownTimer获取更多关于倒计时器的信息。


0

你也可以简单地使用runOnUiThread()

你需要像这样更改你的increaseNumber方法:

private void increaseNumber() {
        number++;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvFragment.setText(String.valueOf(number));
            }
        });

    }

0

asyncTask可以在循环中吗? - androidmanifest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接