Android的camera2,在返回或者重新拍摄的时候出现:sending message to a Handler on a dead thread报错!

973 阅读1分钟

拍照结束后报一下错误,报错堆栈:

Handler (android.os.Handler) {f06e674} sending message to a Handler on a dead thread
    java.lang.IllegalStateException: Handler (android.os.Handler) {f06e674} sending message to a Handler on a dead thread
        at android.os.MessageQueue.enqueueMessage(MessageQueue.java:572)
        at android.os.Handler.enqueueMessage(Handler.java:778)
        at android.os.Handler.sendMessageAtTime(Handler.java:727)
        at android.os.Handler.sendMessageDelayed(Handler.java:697)
        at android.os.Handler.post(Handler.java:427)
        at android.hardware.camera2.impl.CameraDeviceImpl$CameraHandlerExecutor.execute(CameraDeviceImpl.java:2369)
        at android.hardware.camera2.impl.CallbackProxies$SessionStateCallbackProxy.onClosed(CallbackProxies.java:104)
        at android.hardware.camera2.impl.CameraCaptureSessionImpl.close(CameraCaptureSessionImpl.java:596)
        at android.hardware.camera2.impl.CameraCaptureSessionImpl.finalize(CameraCaptureSessionImpl.java:887)
        at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:291)
        at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:278)
        at java.lang.Daemons$Daemon.run(Daemons.java:139)
        at java.lang.Thread.run(Thread.java:920)

解决方案:Pause()里的stopBackgroundThread去除


@Override
public void onPause() {
    closeCamera();
    //stopBackgroundThread();
    super.onPause();
}

在CameraDevice.StateCallback的onClosed内执行。

private final CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {

    @Override
    public void onOpened(@NonNull CameraDevice cameraDevice) {
        ...
    }

    @Override
    public void onDisconnected(@NonNull CameraDevice cameraDevice) {
       ....
    }

    @Override
    public void onError(@NonNull CameraDevice cameraDevice, int error) {
        
    }

    @Override
    public void onClosed(@NonNull CameraDevice camera) {
        super.onClosed(camera);
        stopBackgroundThread();
    }

}