private void testWait(){
HandlerThread ht = new HandlerThread("Camera Handler Thread");
ht.start();
mCameraHandler = new CameraHandler(ht.getLooper());
mCameraHandler.obtainMessage(OPEN_CAMERA, 1, 0).sendToTarget();
boolean ret = false;
ret = mCameraHandler.waitDone();
Log.v(TAG, "ret = " + ret);
}
private class CameraHandler extends Handler {
CameraHandler(Looper looper) {
super(looper);
}
/**
* Waits for all the {@code Message} and {@code Runnable} currently in the queue
* are processed.
*
* @return {@code false} if the wait was interrupted, {@code true} otherwise.
*/
public boolean waitDone() {
final Object waitDoneLock = new Object();
final Runnable unlockRunnable = new Runnable() {
@Override
public void run() {
synchronized (waitDoneLock) {
Log.v(TAG, " notifyAll start");
waitDoneLock.notifyAll();
}
}
};
synchronized (waitDoneLock) {
mCameraHandler.post(unlockRunnable);
try {
Log.v(TAG, "start wait");
waitDoneLock.wait();
} catch (InterruptedException ex) {
Log.v(TAG, "waitDone interrupted");
return false;
}
}
return true;
}
/**
* This method does not deal with the API level check. Everyone should
* check first for supported operations before sending message to this handler.
*/
@Override
public void handleMessage(final Message msg) {
switch (msg.what) {
case OPEN_CAMERA:
try {
Log.v(TAG, "start sleep 4s");
Thread.sleep(4000);
Log.v(TAG, "end sleep 4s");
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
default:
}
}
}