在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);
我得到了“强制关闭”错误。
是什么给出的?
答案 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);