国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > hander同步技巧 利用post之后的消息是最后完成的,实现同步。关键看waitDone的实现。带面精简Camera应用。

hander同步技巧 利用post之后的消息是最后完成的,实现同步。关键看waitDone的实现。带面精简Camera应用。

来源:程序员人生   发布时间:2015-05-08 08:05:21 阅读次数:2911次
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: } } }

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生