如何在Activity中进行样本计数器?这不起作用。
ng-google-charts
答案 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
不是最好的主意。