制作一个简单的计数器,在android上每秒递增一次。我做错了什么?

时间:2015-02-23 10:53:39

标签: android multithreading counter

我正在编写代码来显示一个每秒递增1的计数器。

在运行错误之前,应用程序被强制关闭 -

线程退出未捕获的异常获取资源编号值时没有包标识符

 public class MainActivity extends Activity {

    Handler hand = new Handler();
    TextView ti;
    int i =0;

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

        ti = (TextView) findViewById(R.id.textView);

        hand.postDelayed(run, 1000);
    }

    Runnable run = new Runnable() {
        @Override
        public void run() {
           i++;
           ti.setText(i);
        }
    };
}

我做错了什么?

3 个答案:

答案 0 :(得分:1)

ti.setText(i)正在尝试按i的值解析资源。 请改为ti.setText(String.valueOf(i));

答案 1 :(得分:1)

方法textView.setText(int id)将int作为参数。对于例如R.string.app-name。当您将i作为参数传递时,它会检查i中的ID strings.xmlTextView还提供了重载方法setText(CharSequence text),您可以在此处使用。

textView.setText(""+i); textView.setText(String.valueOf(i));

答案 2 :(得分:1)

如果你需要一个精确的计时器,你应该计算一个差异,从启动计时器开始,在每次通话中增加一个变量都不是一个准确的解决方案,这里是代码,如果你想要一个精确的计时器

private long startTime;
private final Handler handler = new Handler();

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

    final TextView textView = (TextView) findViewById(R.id.textView);

    startTime = System.currentTimeMillis();
    handler.post(new Runnable() {
        @Override
        public void run() {
            long diff = System.currentTimeMillis() - startTime;
            textView.setText(Long.toString(diff / 1000));
            handler.postDelayed(this, 1000);
        }
    });
}