Java 每秒更新文本视图中的数字

Java 每秒更新文本视图中的数字,java,android,scope,handlers,Java,Android,Scope,Handlers,我正在编写我的第一个应用程序,在这个程序中,我需要每秒更新文本视图中的数字,直到按下按钮为止。使用处理程序似乎是不可能的,因为数字是在处理程序之外创建和存储的,但不能声明为final,因为它需要更改线程。睡眠似乎也会使应用程序无限期地挂起,然后再执行上面写的一些代码 final TextView countView = (TextView) findViewById(R.id.counter); countView.setText("100,000,000,000");

我正在编写我的第一个应用程序,在这个程序中,我需要每秒更新文本视图中的数字,直到按下按钮为止。使用处理程序似乎是不可能的,因为数字是在处理程序之外创建和存储的,但不能声明为final,因为它需要更改<代码>线程。睡眠似乎也会使应用程序无限期地挂起,然后再执行上面写的一些代码

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));
使应用程序在单击按钮后无限期挂起,因此即使是第一个
countView.setText(NumberFormat.getInstance().format(total))不执行

在我看来,使用处理程序是不可能的,因为如果声明为final,则
total
无法工作,但是在处理程序中创建一个变量并循环它将导致值永远不会更改

我是否错过了一个显而易见的解决方案?这是我第一次真正尝试使用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

对于停止,您可以使用

此功能有效,但无法解决我遇到的问题。我有一个在代码前面确定的数字,需要更新该数字,但无法将其拖到runnable中,因为它不是最终数字。不能将其声明为最终值,因为它需要更改在“全局”活动中定义此数字,从
onCreate
方法中的任何位置或任何位置恢复/重新创建/获取。在那之后,把上面的代码放进去,然后你就可以在
Runnable
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