Android计时器/ timertask导致我的应用程序崩溃?

时间:2011-06-11 04:07:05

标签: java android timer

在mainActivity的onCreate中测试一个简单的代码块:

Timer timer2 = new Timer(); 
        TimerTask testing = new TimerTask() {
            public void run() { 
                Toast.makeText(mainActivity.this, "test", Toast.LENGTH_SHORT).show();

            }
        };
        timer2.schedule(testing, 1000);

我得到了“强制关闭”错误。

是什么给出的?

6 个答案:

答案 0 :(得分:6)

对于遇到此问题的其他人来说,我通过使用Handler和Runnable来执行Toast来解决问题,这似乎是UI交互所需要的:

    final Handler handler = new Handler(); 
    Timer timer2 = new Timer(); 
    TimerTask testing = new TimerTask() {
        public void run() { 
            handler.post(new Runnable() {
                public void run() {
                    Toast.makeText(mainActivity.this, "test", Toast.LENGTH_SHORT).show();
                }

            });


        }
    };
    timer2.schedule(testing, 1000);

我仍然不明白为什么这是必要的,也许有人可以解释一下?但是,至少这个代码工作大声笑。

答案 1 :(得分:1)

答案 2 :(得分:1)

应用程序崩溃是因为您试图从其他线程(计时器线程)访问UI线程(toast)的元素。你不能这样做!

你可以通过以下方式绕过它:

从计时器线程向UI线程发送处理程序消息,然后在UI处理程序函数中显示toast。

OR

在计时器代码运行中使用' runOnUiThread':

@Override

public void run() 

{

    mainActivity.runOnUiThread(new Runnable() {

        public void run() {

            // Access/update UI here

            Toast.makeText(mainActivity.this, "test", Toast.LENGTH_SHORT).show();

        }

    });

}

答案 3 :(得分:1)

计时器(任务)不好!采用Android方式:使用处理程序。

正如您在代码片段中看到的那样,这也很容易:

首先我们需要一个在100ms后启动Runnable的Handler

private Handler handler = new Handler();
handler.postDelayed(runnable, 100);

我们还需要Handnable for Handler

private Runnable runnable = new Runnable() {
   @Override
   public void run() {
      /* do what you need to do */
      foobar();
      /* and here comes the "trick" */
      handler.postDelayed(this, 100);
   }
};

所以“技巧”是告诉最后的处理程序再次启动Runnable。这样runnable每100ms启动一次,就像scheduleAtFixedRate()TimerTask一样!如果你想让它停止,你只需要调用 handler.removeCallback(runnable),它就不会重新开始,直到你告诉它

答案 4 :(得分:0)

@YoungMoney

它有效,但只是第一次......你是否每秒都显示Toast消息?

我只工作过一次......

===

编辑: 刚刚意识到你的最后一行代码缺少最后一次重复的值。

对于其他任何有关人员,请更改此信息:

timer2.schedule(testing, 1000);

到此:

timer2.schedule(testing, 1000, 2000);

如果您想在1秒内启动计时器,并每2秒更新一次。

答案 5 :(得分:-1)

TimerTask task = new TimerTask() {
    @Override
    public void run() {
        //do something

    }
};

Timer t = new Timer();
t.schedule(task, 2000);