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. 5
      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"); final WorkerHandler handler = WorkerHandler.get("handler");
assertTrue(handler.getThread().isAlive()); assertTrue(handler.getThread().isAlive());
handler.destroy(); 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"); WorkerHandler newHandler = WorkerHandler.get("handler");
assertNotSame(handler, newHandler); assertNotSame(handler, newHandler);
assertTrue(newHandler.getThread().isAlive()); assertTrue(newHandler.getThread().isAlive());
// Ensure old thread dies at some point.
try { handler.getThread().join(500); } catch (InterruptedException ignore) {}
assertFalse(handler.getThread().isAlive());
} }
@Test @Test

@ -329,6 +329,7 @@ public class Camera1Engine extends CameraEngine implements
stub.size = getPictureSize(Reference.OUTPUT); stub.size = getPictureSize(Reference.OUTPUT);
mPictureRecorder = new Full1PictureRecorder(stub, Camera1Engine.this, mCamera); mPictureRecorder = new Full1PictureRecorder(stub, Camera1Engine.this, mCamera);
mPictureRecorder.take(); mPictureRecorder.take();
LOG.i("onTakePicture:", "executed.");
} }
@EngineThread @EngineThread
@ -347,6 +348,7 @@ public class Camera1Engine extends CameraEngine implements
mPictureRecorder = new Snapshot1PictureRecorder(stub, this, mCamera, outputRatio); mPictureRecorder = new Snapshot1PictureRecorder(stub, this, mCamera, outputRatio);
} }
mPictureRecorder.take(); mPictureRecorder.take();
LOG.i("onTakePictureSnapshot:", "executed.");
} }
//endregion //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. // Set parameters that might have been set before the camera was opened.
try { try {
LOG.i("createCamera:", "Applying default parameters."); LOG.i("onStartEngine:", "Opened camera device.");
mCameraCharacteristics = mManager.getCameraCharacteristics(mCameraId); mCameraCharacteristics = mManager.getCameraCharacteristics(mCameraId);
boolean flip = getAngles().flip(Reference.SENSOR, Reference.VIEW); boolean flip = getAngles().flip(Reference.SENSOR, Reference.VIEW);
int format; int format;

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

@ -89,18 +89,20 @@ public class WorkerHandler {
get().post(action); get().post(action);
} }
private String mName;
private HandlerThread mThread; private HandlerThread mThread;
private Handler mHandler; private Handler mHandler;
private Executor mExecutor; private Executor mExecutor;
private WorkerHandler(@NonNull String name) { private WorkerHandler(@NonNull String name) {
mName = name;
mThread = new HandlerThread(name); mThread = new HandlerThread(name);
mThread.setDaemon(true); mThread.setDaemon(true);
mThread.start(); mThread.start();
mHandler = new Handler(mThread.getLooper()); mHandler = new Handler(mThread.getLooper());
mExecutor = new Executor() { mExecutor = new Executor() {
@Override @Override
public void execute(Runnable command) { public void execute(@NonNull Runnable command) {
WorkerHandler.this.run(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. // after quit(), the thread will die at some point in the future. Might take some ms.
// try { handler.getThread().join(); } catch (InterruptedException ignore) {} // 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