2016-11-04 54 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

相關問題