diff --git a/src/main/java/com/budiyev/android/codescanner/CodeScanner.java b/src/main/java/com/budiyev/android/codescanner/CodeScanner.java index 808ec53..e8a965d 100644 --- a/src/main/java/com/budiyev/android/codescanner/CodeScanner.java +++ b/src/main/java/com/budiyev/android/codescanner/CodeScanner.java @@ -566,7 +566,7 @@ public void onPreviewFrame(byte[] data, Camera camera) { return; } Decoder decoder = decoderWrapper.getDecoder(); - if (decoder.isProcessing()) { + if (decoder.shouldSkipTask()) { return; } Point imageSize = decoderWrapper.getImageSize(); diff --git a/src/main/java/com/budiyev/android/codescanner/Decoder.java b/src/main/java/com/budiyev/android/codescanner/Decoder.java index 083c0fa..70bc1be 100644 --- a/src/main/java/com/budiyev/android/codescanner/Decoder.java +++ b/src/main/java/com/budiyev/android/codescanner/Decoder.java @@ -26,8 +26,8 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.SynchronousQueue; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -39,13 +39,14 @@ import com.google.zxing.Result; final class Decoder { - private final BlockingQueue mDecodeQueue = new SynchronousQueue<>(); + private static final int MAX_QUEUE_SIZE = 4; + private final BlockingQueue mDecodeQueue = new ArrayBlockingQueue<>(MAX_QUEUE_SIZE); private final MultiFormatReader mReader; private final DecoderThread mDecoderThread; private final StateListener mStateListener; private final Map mHints; private volatile DecodeCallback mCallback; - private volatile boolean mProcessing; + private volatile boolean mProcessingResult; public Decoder(@NonNull StateListener stateListener, @NonNull List formats, @Nullable DecodeCallback callback) { @@ -80,8 +81,8 @@ public void shutdown() { mDecodeQueue.clear(); } - public boolean isProcessing() { - return mProcessing; + public boolean shouldSkipTask() { + return mProcessingResult || mDecodeQueue.remainingCapacity() == 0; } private final class DecoderThread extends Thread { @@ -103,20 +104,21 @@ public void run() { Result result = null; try { DecodeTask task = mDecodeQueue.take(); - mProcessing = true; mStateListener.onStateChanged(Decoder.State.DECODING); result = task.decode(mReader); } catch (ReaderException ignored) { } finally { if (result != null) { + mProcessingResult = true; + mDecodeQueue.clear(); if (mStateListener.onStateChanged(Decoder.State.DECODED)) { DecodeCallback callback = mCallback; if (callback != null) { callback.onDecoded(result); } } + mProcessingResult = false; } - mProcessing = false; } } catch (InterruptedException e) { break;