pull/696/head
Mattia Iavarone 6 years ago
parent 38b7d816c2
commit 7a3b7da6d2
  1. 6
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/WorkerHandlerTest.java
  2. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java
  3. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  4. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java
  5. 8
      cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/WorkerHandler.java

@ -220,12 +220,12 @@ public class WorkerHandlerTest extends BaseTest {
final WorkerHandler handler = WorkerHandler.get("handler");
assertTrue(handler.getThread().isAlive());
handler.destroy();
// Wait for the thread to die.
try { handler.getThread().join(500); } catch (InterruptedException ignore) {}
assertFalse(handler.getThread().isAlive());
WorkerHandler newHandler = WorkerHandler.get("handler");
assertNotSame(handler, newHandler);
assertTrue(newHandler.getThread().isAlive());
// Ensure old thread dies at some point.
try { handler.getThread().join(500); } catch (InterruptedException ignore) {}
assertFalse(handler.getThread().isAlive());
}
@Test

@ -329,6 +329,7 @@ public class Camera1Engine extends CameraEngine implements
stub.size = getPictureSize(Reference.OUTPUT);
mPictureRecorder = new Full1PictureRecorder(stub, Camera1Engine.this, mCamera);
mPictureRecorder.take();
LOG.i("onTakePicture:", "executed.");
}
@EngineThread
@ -347,6 +348,7 @@ public class Camera1Engine extends CameraEngine implements
mPictureRecorder = new Snapshot1PictureRecorder(stub, this, mCamera, outputRatio);
}
mPictureRecorder.take();
LOG.i("onTakePictureSnapshot:", "executed.");
}
//endregion

@ -386,7 +386,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
// Set parameters that might have been set before the camera was opened.
try {
LOG.i("createCamera:", "Applying default parameters.");
LOG.i("onStartEngine:", "Opened camera device.");
mCameraCharacteristics = mManager.getCameraCharacteristics(mCameraId);
boolean flip = getAngles().flip(Reference.SENSOR, Reference.VIEW);
int format;

@ -369,8 +369,11 @@ public abstract class CameraEngine implements
// onStopEngine() implementation and comments.
LOG.e("DESTROY: Could not destroy synchronously after 6 seconds.",
"Current thread:", Thread.currentThread(),
"Handler thread: ", mHandler.getThread());
// TODO Should we find a solution or is this emulator only?
"Handler thread:", mHandler.getThread());
recreateHandler();
LOG.e("DESTROY: Could not destroy synchronously after 6 seconds.",
"Trying again on thread:", mHandler.getThread());
destroy(unrecoverably);
}
} catch (InterruptedException ignore) {}
}

@ -89,18 +89,20 @@ public class WorkerHandler {
get().post(action);
}
private String mName;
private HandlerThread mThread;
private Handler mHandler;
private Executor mExecutor;
private WorkerHandler(@NonNull String name) {
mName = name;
mThread = new HandlerThread(name);
mThread.setDaemon(true);
mThread.start();
mHandler = new Handler(mThread.getLooper());
mExecutor = new Executor() {
@Override
public void execute(Runnable command) {
public void execute(@NonNull Runnable command) {
WorkerHandler.this.run(command);
}
};
@ -245,6 +247,10 @@ public class WorkerHandler {
// after quit(), the thread will die at some point in the future. Might take some ms.
// try { handler.getThread().join(); } catch (InterruptedException ignore) {}
}
// This should not be needed, but just to be sure, let's remove it from cache.
// For example, interrupt() won't interrupt the thread if it's blocked - it will throw
// an exception instead.
sCache.remove(mName);
}
/**

Loading…
Cancel
Save