2013-04-02 44 views
0

我嘗試運行此代碼的AsyncTask等待功能會導致錯誤

protected String doInBackground(String... params) { 
    InetAddress client = null; 
    boolean run = true; 
    String data = ""; 
    DatagramPacket packet = null; 
    while(run) 
    { 
     if(data.equalsIgnoreCase("")) 
     { 

     } 

     //Send some data 
     if(data.equalsIgnoreCase("connect")) 
     { 

     } 






     //Log.d(TAG, "Data received was :" + data); 

     try 
     { 
      this.wait(25); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      Log.d(TAG, "Error with trying to sleep"); 
      e.printStackTrace(); 
     } 
    } 
    Log.d(TAG, "Error with while run value"); 
    return "finished"; 
} 

,一旦reachs的this.wait(25);我得到這個錯誤

04-02 18:49:25.070: D/gameObject(9065): New game object 
04-02 18:49:25.085: W/dalvikvm(9065): threadid=12: thread exiting with uncaught exception (group=0x40015560) 
04-02 18:49:25.089: E/AndroidRuntime(9065): FATAL EXCEPTION: AsyncTask #2 
04-02 18:49:25.089: E/AndroidRuntime(9065): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.lang.Thread.run(Thread.java:1019) 
04-02 18:49:25.089: E/AndroidRuntime(9065): Caused by: java.lang.IllegalMonitorStateException: object not locked by thread before wait() 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.lang.Object.wait(Native Method) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.lang.Object.wait(Object.java:395) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at com.example.gelorph_v1.gameServer.doInBackground(gameServer.java:116) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at com.example.gelorph_v1.gameServer.doInBackground(gameServer.java:1) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
04-02 18:49:25.089: E/AndroidRuntime(9065):  ... 4 more 

任何這種情況發生的原因?

帆布

回答

1

我不認爲wait是你想要的。這告訴它等待通過呼叫notify()通知另一個thread。嘗試

Thread.sleep(25); // 25是時間以毫秒睡覺

代替。這將使thread睡眠(顯然)的時間量,你繼續之前已經宣佈

Thread

Wait

+0

但我使用AsyncTask你可以使用線程睡眠? – Canvas

+0

當然可以,我一直這樣做。它的背景是'Thread',所以它不會傷害任何東西。你不想在'UI'線程上調用它,但'AsyncTask'就好了。試一試 – codeMagic

+0

@Canvas做了這項工作? – codeMagic

0

您確定要等待,不睡覺?如果您希望它總是暫停25毫秒,請使用睡眠。如果您確實想要使用等待,則需要在等待的對象的同步塊中執行此操作。