计时器代码崩溃我的应用程序

时间:2014-04-12 15:59:27

标签: java android timer android-studio onstart

我正在学习Android开发,而我正在尝试做的是让标签从40分钟开始倒计时,当它达到0时它会停止计数并做其他事情。这是我的代码:

@Override
protected void onStart() {
        super.onStart();
        count = 2400;
        final Timer t = new Timer();//Create the object
        t.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                minLeft = (int) Math.floor(count / 60);
                secLeft = count - minLeft * 60;
                counter = minLeft + ":" + secLeft;
                TextView tv = (TextView) findViewById(R.id.timer);

                Log.i(MainActivity.TAG,minLeft+", "+secLeft+", "+counter);
                tv.setText(counter);
                count--;
                if (minLeft <= 0 && secLeft <= 0) {
                    t.cancel();
                    count = 2400;
                    onFinish();
                }
            }
        }, 1000, 1000);
    }

但是,当我通过单击主活动中的按钮进入该活动时,标签上有文本“Timer”(其原始文本),几秒钟后应用程序崩溃与CalledFromWrongThreadException,但导致该行导致问题似乎是我设置TextView文本的问题。

请提前帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

您的计划任务在后台线程上运行。 并尝试从此后台线程将文本设置为textview。 但是在Android中,所有视图相关的操作都必须在主线程上完成。

这是您计划任务的方式,您必须使用以下内容:

@Override
protected void onStart() {
    super.onStart();
    count = 2400;
    final Timer t = new Timer();//Create the object
    t.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            minLeft = (int) Math.floor(count / 60);
            secLeft = count - minLeft * 60;
            counter = minLeft + ":" + secLeft;
            // the name of your actual activity
            MyActivity.this.runOnUiThread(new Runnable() {
               @Override
               public void run() {
                 TextView tv = (TextView) findViewById(R.id.timer);
                 Log.i(MainActivity.TAG,minLeft+", "+secLeft+", "+counter);
                 tv.setText(counter);
               }
            });

            count--;
            if (minLeft <= 0 && secLeft <= 0) {
                t.cancel();
                count = 2400;
                onFinish();
            }
        }
    }, 1000, 1000);
}

请注意,这段代码可以更优雅地编写,没有所有/那么多匿名类,但它应该可以解决问题。