2016-11-04 19 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); 
} 

あなたの終了条件があるまで、これが所望の遅延(1000ミリ秒)の後に実行されるようにrun()内のコードと、その後のすべての1000msの原因となります会った

+0

しかし、このことはこのコードを特定の時間を1回だけ繰り返す。私は停止するまで5秒ごとに自分のコードを実行したい。だから私はこれのループを使用することはできますか? – g33k

+0

さて、 'Runnable'にロジックを追加してループさせることができます。 if(!conditionMet())handler.postDelayed(....)のようなものです。あなたはもちろん、 'Runnable'内から' Handler'ファイナルにアクセスする必要があります。 –

+0

ありがとうございます。私はあなたのソリューションで最善を尽くします。何かがうまくいかない場合は、私はあなたにpingをします。 – g33k

関連する問題