package com.netsdk.demo.customize.faceReconEx; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.sun.jna.Pointer; import java.awt.*; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; /** * @author 47081 * @version 1.0 * @description 人脸搜索回调默认实现,回调函数请使用单例模式 * @date 2021/4/28 */ public class DefaultFaceFindStateCallback implements NetSDKLib.fFaceFindState { private static volatile DefaultFaceFindStateCallback instance; // 进度队列 private static Map> progresses = new HashMap<>(); private DefaultFaceFindStateCallback() {} public static DefaultFaceFindStateCallback getInstance() { if (instance == null) { synchronized (DefaultFaceFindStateCallback.class) { if (instance == null) { instance = new DefaultFaceFindStateCallback(); } } } return instance; } @Override public void invoke( NetSDKLib.LLong lLoginID, NetSDKLib.LLong lAttachHandle, Pointer pstStates, int nStateNum, Pointer dwUser) { if (nStateNum < 1) { return; } FaceFindHandler faceFindHandler = new FaceFindHandler(); LinkedBlockingQueue progress; NetSDKLib.NET_CB_FACE_FIND_STATE[] msg = new NetSDKLib.NET_CB_FACE_FIND_STATE[nStateNum]; for (int i = 0; i < nStateNum; i++) { msg[i] = new NetSDKLib.NET_CB_FACE_FIND_STATE(); } ToolKits.GetPointerDataToStructArr(pstStates, msg); for (int i = 0; i < nStateNum; i++) { faceFindHandler.setLoginHandler(lLoginID.longValue()); faceFindHandler.setAttachHandler(lAttachHandle.longValue()); faceFindHandler.setnToken(msg[i].nToken); progress = progresses.get(faceFindHandler); if (progress == null) { progress = new LinkedBlockingQueue(); } progress.add(msg[i].nProgress); progresses.put(faceFindHandler, progress); } } private class FaceFindHandler { private long loginHandler; private long attachHandler; private long nToken; public FaceFindHandler() {} public FaceFindHandler(long loginHandler, long attachHandler, long nToken) { this.loginHandler = loginHandler; this.attachHandler = attachHandler; this.nToken = nToken; } public long getLoginHandler() { return loginHandler; } public void setLoginHandler(long loginHandler) { this.loginHandler = loginHandler; } public long getAttachHandler() { return attachHandler; } public void setAttachHandler(long attachHandler) { this.attachHandler = attachHandler; } public long getnToken() { return nToken; } public void setnToken(long nToken) { this.nToken = nToken; } @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; FaceFindHandler that = (FaceFindHandler) o; if (loginHandler != that.loginHandler) return false; if (attachHandler != that.attachHandler) return false; return nToken == that.nToken; } @Override public int hashCode() { int result = (int) (loginHandler ^ (loginHandler >>> 32)); result = 31 * result + (int) (attachHandler ^ (attachHandler >>> 32)); result = 31 * result + (int) (nToken ^ (nToken >>> 32)); return result; } } public int getProgress(long loginHandler, long attachHandler, int nToken) throws InterruptedException { return progresses.get(new FaceFindHandler(loginHandler, attachHandler, nToken)).take(); } }