我试图制作一个会在一定时间后做某件事的计时器:
int delay = 1000;
int period = 1000;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
//Does stuff
}
}, delay, period);
然而,应用程序在等待期后崩溃。这是Java代码,因此它可能与Android不完全兼容(如while循环)。有什么我做错了吗?
答案 0 :(得分:1)
这样的东西应该工作,创建一个处理程序,并等待1秒:)这通常是最好的方式,它是最整洁的,也可能是最好的内存,因为它没有真正做太多,加上因为只有这是最简单的解决方案才会这样做。
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
// do your stuff
}
}, 1000);
如果您希望每秒运行一次,那么这样的事情将是最好的:
Thread thread = new Thread()
{
@Override
public void run() {
try {
while(true) {
sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
如果你想要一个GUI线程,那么这样的事情应该有效:
ActivityName.this.runOnUiThread(new Runnable()
{
public void run(){
try {
while(true) {
sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
答案 1 :(得分:1)
如果您的应用在等待之后崩溃,那么您的计时器任务正在执行其工作并按计划执行您的代码。问题必须出在run()
出现的代码中(例如,您可能正在尝试更新后台线程中的UI元素)。
如果您发布更多代码和logcat,我可能会更具体地说明您遇到的错误,但您的问题与TimerTask有关。
答案 2 :(得分:1)
计时器,你也可以在UI线程上运行你的代码:
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
timerMethod();
}
}, 0, 1000);
}
private void timerMethod(){
// This method is called directly by the timer
// and runs in the same thread as the timer.
// We call the method that will work with the UI
// through the runOnUiThread method.
this.runOnUiThread(timerTick);
}
private Runnable timerTick = new Runnable() {
public void run() {
// This method runs in the same thread as the UI.
// Do something to the UI thread here
}
};