Unwind DecodeHandler out of DecodeThread to avoid a VerifyError ?
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Sun, 11 Apr 2010 07:25:50 +0000 (07:25 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Sun, 11 Apr 2010 07:25:50 +0000 (07:25 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@1297 59b500cc-1b3d-0410-9834-0bbf25fbcc57

android/src/com/google/zxing/client/android/DecodeHandler.java [new file with mode: 0644]
android/src/com/google/zxing/client/android/DecodeThread.java

diff --git a/android/src/com/google/zxing/client/android/DecodeHandler.java b/android/src/com/google/zxing/client/android/DecodeHandler.java
new file mode 100644 (file)
index 0000000..ff7d0a9
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.zxing.client.android;
+
+import com.google.zxing.BinaryBitmap;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.MultiFormatReader;
+import com.google.zxing.ReaderException;
+import com.google.zxing.Result;
+import com.google.zxing.client.android.camera.CameraManager;
+import com.google.zxing.common.HybridBinarizer;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import java.util.Hashtable;
+
+final class DecodeHandler extends Handler {
+
+  private static final String TAG = DecodeHandler.class.getSimpleName();
+
+  private final CaptureActivity activity;
+  private final MultiFormatReader multiFormatReader;
+
+  DecodeHandler(CaptureActivity activity, Hashtable<DecodeHintType, Object> hints) {
+    multiFormatReader = new MultiFormatReader();
+    multiFormatReader.setHints(hints);
+    this.activity = activity;
+  }
+
+  @Override
+  public void handleMessage(Message message) {
+    switch (message.what) {
+      case R.id.decode:
+        decode((byte[]) message.obj, message.arg1, message.arg2);
+        break;
+      case R.id.quit:
+        Looper.myLooper().quit();
+        break;
+    }
+  }
+
+  /**
+   * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
+   * reuse the same reader objects from one decode to the next.
+   *
+   * @param data   The YUV preview frame.
+   * @param width  The width of the preview frame.
+   * @param height The height of the preview frame.
+   */
+  private void decode(byte[] data, int width, int height) {
+    long start = System.currentTimeMillis();
+    Result rawResult = null;
+    PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);
+    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+    try {
+      rawResult = multiFormatReader.decodeWithState(bitmap);
+    } catch (ReaderException re) {
+      // continue
+    } finally {
+      multiFormatReader.reset();
+    }
+
+    if (rawResult != null) {
+      long end = System.currentTimeMillis();
+      Log.v(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString());
+      Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);
+      Bundle bundle = new Bundle();
+      bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
+      message.setData(bundle);
+      message.sendToTarget();
+    } else {
+      Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
+      message.sendToTarget();
+    }
+  }
+
+}
index 7a407b1..c3d77de 100755 (executable)
 package com.google.zxing.client.android;
 
 import com.google.zxing.BarcodeFormat;
-import com.google.zxing.BinaryBitmap;
 import com.google.zxing.DecodeHintType;
-import com.google.zxing.MultiFormatReader;
-import com.google.zxing.ReaderException;
-import com.google.zxing.Result;
 import com.google.zxing.ResultPointCallback;
-import com.google.zxing.client.android.camera.CameraManager;
-import com.google.zxing.common.HybridBinarizer;
 
 import android.content.SharedPreferences;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
-import android.os.Message;
 import android.preference.PreferenceManager;
-import android.util.Log;
 
 import java.util.Hashtable;
 import java.util.Vector;
@@ -44,20 +35,14 @@ import java.util.Vector;
  */
 final class DecodeThread extends Thread {
 
-  private static final String TAG = DecodeThread.class.getSimpleName();
-
   public static final String BARCODE_BITMAP = "barcode_bitmap";
 
-  private Handler handler;
-  private final CaptureActivity activity;
-  private final MultiFormatReader multiFormatReader;
+  private final Handler handler;
 
   DecodeThread(CaptureActivity activity,
                Vector<BarcodeFormat> decodeFormats,
                String characterSet,
                ResultPointCallback resultPointCallback) {
-    this.activity = activity;
-    multiFormatReader = new MultiFormatReader();
     Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
 
     // The prefs can't change while the thread is running, so pick them up once here.
@@ -82,7 +67,7 @@ final class DecodeThread extends Thread {
 
     hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback);
 
-    multiFormatReader.setHints(hints);
+    this.handler = new DecodeHandler(activity, hints);
   }
 
   Handler getHandler() {
@@ -92,55 +77,7 @@ final class DecodeThread extends Thread {
   @Override
   public void run() {
     Looper.prepare();
-    handler = new Handler() {
-      @Override
-      public void handleMessage(Message message) {
-        switch (message.what) {
-          case R.id.decode:
-            decode((byte[]) message.obj, message.arg1, message.arg2);
-            break;
-          case R.id.quit:
-            Looper.myLooper().quit();
-            break;
-        }
-      }
-    };
     Looper.loop();
   }
 
-  /**
-   * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
-   * reuse the same reader objects from one decode to the next.
-   *
-   * @param data   The YUV preview frame.
-   * @param width  The width of the preview frame.
-   * @param height The height of the preview frame.
-   */
-  private void decode(byte[] data, int width, int height) {
-    long start = System.currentTimeMillis();
-    Result rawResult = null;
-    PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);
-    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
-    try {
-      rawResult = multiFormatReader.decodeWithState(bitmap);
-    } catch (ReaderException re) {
-      // continue
-    } finally {
-      multiFormatReader.reset();
-    }
-
-    if (rawResult != null) {
-      long end = System.currentTimeMillis();
-      Log.v(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString());
-      Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);
-      Bundle bundle = new Bundle();
-      bundle.putParcelable(BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
-      message.setData(bundle);
-      message.sendToTarget();
-    } else {
-      Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
-      message.sendToTarget();
-    }
-  }
-
 }