每秒更新 TextView 中的数字
Updating a number in a TextView every second
我正在编写我的第一个应用程序,我需要每秒更新文本视图中的数字,直到按下按钮。使用处理程序似乎是不可能的,因为数字是在处理程序之外创建和存储的,但它不能声明为 final,因为它需要更改。 Thread.sleep
似乎还会使应用程序无限期挂起,然后再执行上面编写的某些代码。
final TextView countView = (TextView) findViewById(R.id.counter);
countView.setText("100,000,000,000");
//set a Calendar object to be 00:00:00:00 on Jan 1, 2015
final Calendar startTime = Calendar.getInstance();
startTime.set(2015, 0, 0, 12, 0, 0);
startTime.set(Calendar.MILLISECOND, 0);
final Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//set a Calendar to be the time that the button is clicked and find the difference in ms between it and startTime
Calendar nowTime = Calendar.getInstance();
double milStart = startTime.getTimeInMillis();
double milNow = nowTime.getTimeInMillis();
double diff = (milNow-milStart)/1000; //difference in seconds between "start" date and current date
double total = 100000000000L; //# that needs to be updated
for(long i = 0L; i < diff; i++) {
total += 1.8;
}
countView.setText(NumberFormat.getInstance().format(total));
我需要继续将 total
每秒递增 1.8 或每 556 毫秒递增 1。
while(true) {
countView.setText(NumberFormat.getInstance().format(total));
total += 1.8;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
导致应用程序在单击按钮后立即无限期挂起,因此即使是第一个 countView.setText(NumberFormat.getInstance().format(total));
也不会执行。
使用处理程序对我来说似乎是不可能的,因为 total
如果声明为 final 则无法工作,但是在处理程序中创建一个变量并循环它会导致值永远不会改变。
我错过了一个明显的解决方案吗?这是我对 Java 的第一次真正尝试,所以对我来说都是全新的
你可以使用 Handler
Handler h = new Handler();
final Runnable r = new Runnable() {
int count = 0;
@Override
public void run() {
count++;
textView.setText(""+count*1.8);
h.postDelayed(this, 1000); //ms
}
};
h.postDelayed(r, 1000); // one second in ms
我正在编写我的第一个应用程序,我需要每秒更新文本视图中的数字,直到按下按钮。使用处理程序似乎是不可能的,因为数字是在处理程序之外创建和存储的,但它不能声明为 final,因为它需要更改。 Thread.sleep
似乎还会使应用程序无限期挂起,然后再执行上面编写的某些代码。
final TextView countView = (TextView) findViewById(R.id.counter);
countView.setText("100,000,000,000");
//set a Calendar object to be 00:00:00:00 on Jan 1, 2015
final Calendar startTime = Calendar.getInstance();
startTime.set(2015, 0, 0, 12, 0, 0);
startTime.set(Calendar.MILLISECOND, 0);
final Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//set a Calendar to be the time that the button is clicked and find the difference in ms between it and startTime
Calendar nowTime = Calendar.getInstance();
double milStart = startTime.getTimeInMillis();
double milNow = nowTime.getTimeInMillis();
double diff = (milNow-milStart)/1000; //difference in seconds between "start" date and current date
double total = 100000000000L; //# that needs to be updated
for(long i = 0L; i < diff; i++) {
total += 1.8;
}
countView.setText(NumberFormat.getInstance().format(total));
我需要继续将 total
每秒递增 1.8 或每 556 毫秒递增 1。
while(true) {
countView.setText(NumberFormat.getInstance().format(total));
total += 1.8;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
导致应用程序在单击按钮后立即无限期挂起,因此即使是第一个 countView.setText(NumberFormat.getInstance().format(total));
也不会执行。
使用处理程序对我来说似乎是不可能的,因为 total
如果声明为 final 则无法工作,但是在处理程序中创建一个变量并循环它会导致值永远不会改变。
我错过了一个明显的解决方案吗?这是我对 Java 的第一次真正尝试,所以对我来说都是全新的
你可以使用 Handler
Handler h = new Handler();
final Runnable r = new Runnable() {
int count = 0;
@Override
public void run() {
count++;
textView.setText(""+count*1.8);
h.postDelayed(this, 1000); //ms
}
};
h.postDelayed(r, 1000); // one second in ms