每秒更改TextView中的文本

时间:2018-06-24 12:27:00

标签: java android

我正在尝试实现以下功能:按下按钮并在textView中显示每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 个答案:

答案 0 :(得分:2)

您可以使用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);
  }
};

答案 1 :(得分:0)

您可以使用Async任务,并且可以在onPostExecute()方法中更新ui。这是您可以参考的教程:-https://www.journaldev.com/9708/android-asynctask-example-tutorial

答案 2 :(得分: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的更多信息 CountDownTimer

答案 3 :(得分:0)

也可以简单地使用 runOnUiThread()

您必须像下面这样更改您的gainNumber方法:

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

    }