计数器循环

时间:2016-05-08 11:04:03

标签: android

如何在Activity中进行样本计数器?这不起作用。

ng-google-charts

2 个答案:

答案 0 :(得分:4)

onCreate()中,您在UI线程内部开始无限循环,完全阻止它。或者,您可以使用Handler进行定期更新。也许使用更大的延迟并在某个时候停止它。

public class MainActivity extends AppCompatActivity implements Runnable {
    private final Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        run();
    }

    @Override
    public void run() {
        updateTv();
        mHandler.postDelayed(this, 17);
    }

    public void updateTv() {
        int counter = 100;
        final TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(String.valueOf(counter));
        counter--;
    }
}

无论如何,你肯定应该阅读What is the Android UiThread (UI thread)

答案 1 :(得分:1)

考虑使用Timer类,它允许您定义将以指定速率调用的回调方法。

符合您需求的示例:

public class CounterActivity extends AppCompatActivity {
    private TextView mCounterTextView;
    private Timer mTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_counter);

        mCounterTextView = (TextView) findViewById(R.id.counterTextView);

        mTimer = new Timer();
        mTimer.scheduleAtFixedRate(
            new CounterTask(100), 0, TimeUnit.SECONDS.toMillis(1));
    }

    protected class CounterTask extends TimerTask {
        protected int mCounter;

        CounterTask(int initial) {
            mCounter = initial;
        }

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mCounterTextView.setText(String.valueOf(mCounter));
                }
            });

            --mCounter;
        }
    }
}

还应注意另一件事。当Timer执行它自己的线程时 - 它会阻止您从主线程外部更新UI。在这种情况下 您必须使用Runnable方法注册runOnUiThread

此外,在循环中调用findViewById不是最好的主意。