CameraView是CameraX的高度封装使用方便简单
如果APP就一个页面用到CameraX直接用CameraX.unbindAll()全部解绑没问题。
但是如果两个页面都是了CameraX就会有很大几率出现相机没启动,原因是CameraX.unbindAll()的执行会延迟,比如有A,B两个页面,A页面启动B页面时执行CameraX.unbindAll(),肯能会出现B页面相机刚起动就被关闭了,导致相机黑屏没启动。
后面看了一遍源码,CameraView是跟着页面生命周期Lifecycle走的,就冒出一个想法,能不能不用页面的生命周期直接自己给他弄一个,后面试了下还整没问题,只需要在关CameraX闭的时候执行一下Lifecycle的onDestroy,CameraX就会自行关闭,并释放。
上代码
//自定义生命周期
private LifecycleRegistry cameraLifecycleRegistry;
private LifecycleOwner cameraLifecycleOwner;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cameraLifecycleOwner = () -> cameraLifecycleRegistry;
cameraLifecycleRegistry = new LifecycleRegistry(cameraLifecycleOwner);
cameraLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
@Override
protected void onResume() {
super.onResume();
// 绑定生命周期,在需要启动的时候绑定一下新的生命周期
cameraLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
mCameraView.bindToLifecycle(new WeakReference<>(cameraLifecycleOwner).get());
}
//在需要关闭的位置执行
cameraLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
网友评论