人臉識別須要init初始化(FaceServer中),離開時須要unInit銷燬;當一個含有人臉識別的界面A跳向另外一個含有人臉識別的界面B時,因爲初始化和銷燬都是對FaceServer類加鎖(synchronized (this) {})的,因此致使註冊時爲註銷失敗,或註冊了又被註銷失敗。this
FaceServer類中: 初始化: 在這裏插線程
public boolean init(Context context) { synchronized (this) { if (faceEngine == null && context != null) { faceEngine = new FaceEngine(); int engineCode = faceEngine.init(context, FaceEngine.ASF_DETECT_MODE_IMAGE, FaceEngine.ASF_OP_0_HIGHER_EXT, 16, 1, FaceEngine.ASF_FACE_RECOGNITION | FaceEngine.ASF_FACE_DETECT); if (engineCode == ErrorInfo.MOK) { initFaceList(context); return true; } else { faceEngine = null; Log.e(TAG, "init: failed! code = " + engineCode); return false; } } return false; } }
銷燬:code
public void unInit() { synchronized (this) { if (faceRegisterInfoList != null) { faceRegisterInfoList.clear(); faceRegisterInfoList = null; } if (faceEngine != null) { faceEngine.unInit(); faceEngine = null; } } }
兩我的臉識別界面都是用的同一個FaceServer類,synchronized致使若是當前有其餘線程正持有該類鎖,那麼新到的線程就必須等待,因此對象
①A跳轉B後註銷A(uninit),則會致使B中初始化(init)時已存在faceEngine對象,而後註銷A時又會刪除faceEngine對象,致使人臉註冊失敗it