2014-11-06 85 views
0

我需要做currentThread等一下,在UiThread做一些操作,然后在UiThread打电话currentThread().notify()。我正在尝试这个代码打电话Thread.wait()

Handler uiHandler = new Handler(Looper.getMainLooper()); 
uiHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      currentThread().wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     AlertDialog.Builder facultyChooser = new AlertDialog.Builder(ctx); 
     facultyChooser.setTitle("choose") 
       .setCancelable(false) 
       .setItems(arr, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int item) { 
         currentThread().notify(); 
        } 
       }) 
       .create() 
       .show(); 
     } 
    }); 
} 

但得到java.lang.IllegalMonitorStateException: object not locked by thread before wait()异常。请帮帮我。

回答

1

试试这个代码:

final Thread CURRENT_THREAD = currentThread(); 
Handler uiHandler = new Handler(Looper.getMainLooper()); 
uiHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     AlertDialog.Builder facultyChooser = new AlertDialog.Builder(ctx); 
     facultyChooser.setTitle("choose") 
       .setCancelable(false) 
       .setItems(arr, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int item) { 
         synchronized(CURRENT_THREAD) { 
          CURRENT_THREAD.notify(); 
         } 
        } 
       }) 
       .create() 
       .show(); 
     } 
    }); 
} 
synchronized(CURRENT_THREAD) { 
     try { 
      CURRENT_THREAD.notify(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
}