在Android应用中等待之前,对象未被线程锁定

时间:2016-11-04 05:44:41

标签: android

在我的Android应用中,我试图每5秒执行一次任务。

我尝试过这样的事情:

@Override
public void onCreate() {
   //standard initialization code

    letsChange();           //method name

    try{
        wait(1000);
    } catch(Exception e) {
        e.printstackstrace();
    }
}

但是我收到以下错误消息:

  

java.lang.IllegalMonitorStateException:对象在wait()之前未被线程锁定

我该怎么做才能阻止这种情况?

1 个答案:

答案 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运行一次,直到满足终止条件。