2016-11-04 22 views
3

在我的Android应用程序中,我试图每隔5秒执行一次任务。对象在Android应用程序中等待之前未被线程锁定

我试图做这样的事情:

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

    letsChange();   //method name 

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

,但我得到了以下错误消息:

java.lang.IllegalMonitorStateException:由线程等待对象之前没有锁定()

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

+0

如果可能,请上传您的整个代码 – sharan

+0

http://stackoverflow.com/questions/26590542/java-lang-illegalmonitorstateexception-object-not-locked-by-thread-before-wait –

回答

2

当您在类内调用wait()时,实际上您正在对该类的当前实例调用wait()。要做到这一点,它需要在该实例上锁定。如果另一个线程有锁,则无法等待。

添加​​到onCreate()将获得锁(在Activity的当前实例),并让你叫wait()里面,但是这是绝对不想你想做的事,因为它会阻止主/ 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()到所需的延迟后运行的代码(1000毫秒),然后每1000毫秒,直到您的终止条件是满足。

+0

但是这个东西会运行此代码后具体的时间只是一次。我希望它每隔5秒运行我的代码,直到我说停止。那么我可以使用for循环吗? – g33k

+0

那么你可以添加逻辑到'Runnable'来循环。就像'if(!conditionMet())handler.postDelayed(....)'。当然,你必须使'Handler'最后从'Runnable'内部访问它。 –

+0

谢谢你这么多伴侣。我会尽力解决您的问题。如果出现问题,我会ping你。 – g33k

相关问题