zoukankan      html  css  js  c++  java
  • Android 虹软2.0人脸识别,注册失败问题 分析synchronized的作用

    人脸识别需要init初始化(FaceServer中),离开时需要unInit销毁;当一个含有人脸识别的界面A跳向另一个含有人脸识别的界面B时,由于初始化和销毁都是对FaceServer类加锁(synchronized (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;
    }
    }
    

      

    销毁:

    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对象,导致人脸注册失败

  • 相关阅读:
    配置samba
    extern c
    剑指offer 孩子们的游戏
    剑指offer 扑克牌顺子
    剑指offer 翻转单词顺序列
    剑指offer 左旋转字符串
    mysql查看或显示当前存在多少数据库
    vim替换
    平衡二叉树
    将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • 原文地址:https://www.cnblogs.com/Zzz-/p/10683592.html
Copyright © 2011-2022 走看看