hander同步技巧 利用post之后的消息是最后完成的,實現(xiàn)同步。關(guān)鍵看waitDone的實現(xiàn)。帶面精簡Camera應(yīng)用。
來源:程序員人生 發(fā)布時間:2015-05-08 08:05:21 閱讀次數(shù):3043次
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:
}
}
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈