From eb9a064544ed7955e31bc349c07e82f6f0728e37 Mon Sep 17 00:00:00 2001 From: dswitkin Date: Fri, 11 Apr 2008 20:25:09 +0000 Subject: [PATCH] Made the worker threads shut down synchronously to fix a race condition where the CameraManager could close the camera driver too soon. git-svn-id: http://zxing.googlecode.com/svn/trunk@357 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../android/BarcodeReaderCaptureActivity.java | 3 +-- .../google/zxing/client/android/CameraThread.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/android-m3/src/com/google/zxing/client/android/BarcodeReaderCaptureActivity.java b/android-m3/src/com/google/zxing/client/android/BarcodeReaderCaptureActivity.java index 78e578f2..861f4494 100644 --- a/android-m3/src/com/google/zxing/client/android/BarcodeReaderCaptureActivity.java +++ b/android-m3/src/com/google/zxing/client/android/BarcodeReaderCaptureActivity.java @@ -91,8 +91,7 @@ public final class BarcodeReaderCaptureActivity extends Activity { protected void onPause() { super.onPause(); if (cameraThread != null) { - Message quit = Message.obtain(cameraThread.handler, R.id.quit); - quit.sendToTarget(); + cameraThread.quitSynchronously(); cameraThread = null; } cameraManager.closeDriver(); diff --git a/android-m3/src/com/google/zxing/client/android/CameraThread.java b/android-m3/src/com/google/zxing/client/android/CameraThread.java index 7ab1a863..1c364405 100644 --- a/android-m3/src/com/google/zxing/client/android/CameraThread.java +++ b/android-m3/src/com/google/zxing/client/android/CameraThread.java @@ -76,6 +76,10 @@ final class CameraThread extends Thread { state = State.DONE; Message quit = Message.obtain(decodeThread.handler, R.id.quit); quit.sendToTarget(); + try { + decodeThread.join(); + } catch (InterruptedException e) { + } Looper.myLooper().quit(); break; case R.id.decode_started: @@ -116,6 +120,15 @@ final class CameraThread extends Thread { Looper.loop(); } + public void quitSynchronously() { + Message quit = Message.obtain(handler, R.id.quit); + quit.sendToTarget(); + try { + join(); + } catch (InterruptedException e) { + } + } + public void setDecodeAllMode() { Message message = Message.obtain(decodeThread.handler, R.id.set_decode_all_mode); message.sendToTarget(); -- 2.20.1