Android 虹軟2.0人臉識別,註冊失敗問題 分析synchronized的做用

人臉識別須要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

相關文章
相關標籤/搜索