在我的Android应用中,我试图每5秒执行一次任务。
我尝试过这样的事情:
@Override
public void onCreate() {
//standard initialization code
letsChange(); //method name
try{
wait(1000);
} catch(Exception e) {
e.printstackstrace();
}
}
但是我收到以下错误消息:
java.lang.IllegalMonitorStateException:对象在wait()之前未被线程锁定
我该怎么做才能阻止这种情况?
答案 0 :(得分:2)
当你在类中调用wait()
时,实际上是在该类的当前实例上调用wait()
。要做到这一点,它需要锁定该实例。如果另一个线程有锁,你将无法等待。
将synchronized
添加到onCreate()
会获取锁定(Activity
的当前实例)并允许您在内部调用wait()
,但这肯定是< / em>不希望你这样做,因为它会阻止主/ UI线程并导致你的应用无响应。
您可能想要的是您的活动中的以下内容:
private boolean isTerminationConditionMet = false;
@Override
public void onCreate() {
//standard Android onCreate code
final Handler handler = new Handler();
final Runnable task = new Runnable() {
@Override
public void run() {
//code you want to run every second
if (!isTerminationConditionMet()) {
handler.postDelayed(task, 1000);
}
}
}
handler.postDelayed(task, 1000);
}
这将导致run()
内的代码在所需的延迟(1000ms)之后运行,然后每1000 ms运行一次,直到满足终止条件。