From b7408dc6c42d7672b1d994fbdd29b8bc76635ea9 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Tue, 20 Jan 2026 14:00:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/LoginByFaceActivity.kt | 164 +++++++++++------- .../sw/platecabinet/utils/IntervalExecutor.kt | 42 ++--- .../main/res/layout/activity_login_face.xml | 40 ++--- 3 files changed, 147 insertions(+), 99 deletions(-) diff --git a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt index 214bc70..92b068a 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt @@ -66,6 +66,9 @@ import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.json.JSONObject import timber.log.Timber +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.TimeUnit import kotlin.math.log /** @@ -239,6 +242,9 @@ class LoginByFaceActivity : BaseActivity(), // return@Observer // } currentUserId = result?.faceEntity?.userName + plateEnable = true +// checkFaceJob?.cancel() +// getFaceJob?.cancel() // viewModel.getUserInfoById(memberId = userId) // ToastUtils.showToast(currentUserId) // if (!currentUserId.isNullOrBlank()) { @@ -305,7 +311,6 @@ class LoginByFaceActivity : BaseActivity(), SpTool.savePlateData(items) // debouncer.reset() - //recognizeViewModel.recognizeUserId.postValue(CompareResult(null,0f)) } // } } @@ -343,8 +348,10 @@ class LoginByFaceActivity : BaseActivity(), recognizeViewModel.destroy() EventBus.getDefault().unregister(this) - countDownJob?.cancel() - checkFaceJob?.cancel() +// countDownJob?.cancel() +// checkFaceJob?.cancel() + getFaceScheduler?.shutdown() + checkFaceScheduler?.shutdown() super.onDestroy() } @@ -469,6 +476,8 @@ class LoginByFaceActivity : BaseActivity(), if (facePreviewInfoList.isNullOrEmpty()) { currentPlateInfo = null currentUserId = null +// checkFaceJob?.cancel() +// getFaceJob?.cancel() } recognizeViewModel.clearLeftFace(facePreviewInfoList) } @@ -552,23 +561,28 @@ class LoginByFaceActivity : BaseActivity(), private var tempUserId: String = "" override fun onResume() { super.onResume() - if (isFirstOpen) { - goInitActivity() - binding.root.postDelayed({ - isFirstOpen = false - }, 1000) - return + try { + if (isFirstOpen) { + goInitActivity() + binding.root.postDelayed({ + isFirstOpen = false + }, 1000) + return + } + faceDataList.clear() + plateEnable = true + collectCount = 0 + tempUserId = "${System.currentTimeMillis()}" + resumeCamera() + viewModel.resetUserInfo() + countDownTimer?.let { + it.cancel() + it.start() + } + checkFaceState() + } catch (e: Exception) { + e.printStackTrace() } - plateEnable = true - collectCount = 0 - tempUserId = "${System.currentTimeMillis()}" - resumeCamera() - viewModel.resetUserInfo() - countDownTimer?.let { - it.cancel() - it.start() - } - checkFaceState() } private var isFirstOpen = true @@ -622,15 +636,25 @@ class LoginByFaceActivity : BaseActivity(), recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY) loadLogInfo("collectFace: ----------5,人脸采集中-----------") getFaceData { faceData -> + if (faceDataList.isNotEmpty()) { + return@getFaceData + } + faceDataList.add(faceData) + + checkFaceScheduler?.shutdown() + getFaceScheduler?.shutdown() +// checkFaceJob?.cancel() +// getFaceJob?.cancel() + recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE) // userFaceInfo = null Thread { - val faceDao = FaceDatabase.getInstance(this).faceDao() - val entity = faceDao.queryByUserName(tempUserId) - if (entity != null) { - //已存在用户 - loadLogInfo("collectFace,saveFaceInfo: ----------9,数据库已存在该人脸数据-----------") - return@Thread - } +// val faceDao = FaceDatabase.getInstance(App.getContext()).faceDao() +// val entity = faceDao.queryByUserName(tempUserId) +// if (entity != null) { +// //已存在用户 +// loadLogInfo("collectFace,saveFaceInfo: ----------9,数据库已存在该人脸数据-----------") +// return@Thread +// } saveFaceInfo(faceData) }.start() } @@ -647,29 +671,38 @@ class LoginByFaceActivity : BaseActivity(), tcpClient?.send(jsonObject) } + private val getFaceScheduler: ScheduledExecutorService? = Executors.newScheduledThreadPool(1); + private val checkFaceScheduler: ScheduledExecutorService? = Executors.newScheduledThreadPool(1); + private fun getFaceData(block: (String) -> Unit) { - runBlocking { - job = executor.startIntervalTask(5) { -// if (currentUserId != null && currentUserId!!.isNotBlank()) { -// toast("您已采集过人脸信息") -// return@startIntervalTask -// } -// loadLogInfo("collectFace,getFaceData: ----------6,正在获人脸取特征数据") - if (userFaceInfo == null) { - return@startIntervalTask - } - loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------") - val faceData: String? = Base64.encode(userFaceInfo?.faceFeature?.featureData) - if (faceData.isNullOrBlank()) { - return@startIntervalTask - } - block(faceData) - checkFaceJob?.cancel() - job?.cancel() - } - } + getFaceScheduler?.scheduleWithFixedDelay( + { + getFaceDataBlock(block) + }, 5L, 5L, TimeUnit.MILLISECONDS + ) +// runBlocking { +// getFaceJob = executor.startIntervalTask(5) { + +// getFaceJob?.cancel() +// checkFaceJob?.cancel() +// } +// } } + private fun getFaceDataBlock(block: (String) -> Unit) { + if (userFaceInfo == null) { + return + } + val faceData: String? = Base64.encode(userFaceInfo?.faceFeature?.featureData) + if (faceData.isNullOrBlank()) { + return + } + loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------") + block(faceData) + } + + private var faceDataList: MutableList = mutableListOf() + private fun loadLogInfo(msg: String) { Log.d(TAG, msg) // logAdapter.addData(msg) @@ -678,7 +711,7 @@ class LoginByFaceActivity : BaseActivity(), private var facePreviewInfoList: MutableList? = null private var userFaceInfo: UserFaceInfo? = null private var countDownJob: Job? = null - private var job: Job? = null +// private var getFaceJob: Job? = null val executor = IntervalExecutor() private var currentUserId: String? = null private fun countDown() { @@ -703,7 +736,8 @@ class LoginByFaceActivity : BaseActivity(), private fun saveFaceInfo(faceData: String) { try { - checkFaceJob?.cancel() +// getFaceJob?.cancel() +// checkFaceJob?.cancel() sendFaceData(faceData) loadLogInfo("collectFace,saveFaceInfo: ----------12,人脸数据发送完成时间:${DateTimeUtils.getDateTimeString()}-----------") @@ -816,19 +850,31 @@ class LoginByFaceActivity : BaseActivity(), private val WAITING_TIME = 3 * 1000L private var checkStartTime = 0L - private var checkFaceJob: Job? = null +// private var checkFaceJob: Job? = null private fun checkFaceState() { checkStartTime = System.currentTimeMillis() - checkFaceJob = executor.startIntervalTask(5) { - Log.d("Login", "currentUserId=${currentUserId}") - if (currentUserId.isNullOrBlank().not()) { - checkFaceJob?.cancel() - return@startIntervalTask - } - if (System.currentTimeMillis() - checkStartTime >= WAITING_TIME) { - //超过5秒采集人脸并识别 - collectFace() - } + + checkFaceScheduler?.scheduleWithFixedDelay( + { + checkFaceBlock() + }, 5L, 5L, TimeUnit.MILLISECONDS + ) + +// checkFaceJob = executor.startIntervalTask(5) { +// +// } + } + + private fun checkFaceBlock() { + Log.d("Login", "currentUserId=${currentUserId}") + if (currentUserId.isNullOrBlank().not()) { +// checkFaceJob?.cancel() + checkFaceScheduler?.shutdown() + return + } + if (System.currentTimeMillis() - checkStartTime >= WAITING_TIME) { + //超过5秒采集人脸并识别 + collectFace() } } diff --git a/app/src/main/java/com/sw/platecabinet/utils/IntervalExecutor.kt b/app/src/main/java/com/sw/platecabinet/utils/IntervalExecutor.kt index 230994a..c6ad04e 100644 --- a/app/src/main/java/com/sw/platecabinet/utils/IntervalExecutor.kt +++ b/app/src/main/java/com/sw/platecabinet/utils/IntervalExecutor.kt @@ -15,6 +15,7 @@ class IntervalExecutor { fun startIntervalTask(delayMillis: Long, action: suspend () -> Unit): Job { return CoroutineScope(Dispatchers.Default).launch { while (isActive) { + ensureActive() action() delay(delayMillis) } @@ -36,6 +37,7 @@ class IntervalExecutor { return CoroutineScope(Dispatchers.Default).launch { delay(initialDelay) while (isActive) { + ensureActive() action() delay(delayMillis) } @@ -44,23 +46,23 @@ class IntervalExecutor { } // 使用示例 -fun main() = runBlocking { - val executor = IntervalExecutor() - - // 示例1:每隔10秒执行一次 - val job1 = executor.startIntervalTask(10000) { - println("定时任务执行: ${System.currentTimeMillis()}") - // 这里可以执行你的业务逻辑 - } - - // 示例2:先延迟5秒,然后每隔3秒执行一次 - val job2 = executor.startIntervalTaskWithInitialDelay(5000, 3000) { - println("带初始延迟的定时任务: ${System.currentTimeMillis()}") - } - - // 运行30秒后取消任务 - delay(30000) - job1.cancel() - job2.cancel() - println("所有定时任务已取消") -} \ No newline at end of file +//fun main() = runBlocking { +// val executor = IntervalExecutor() +// +// // 示例1:每隔10秒执行一次 +// val job1 = executor.startIntervalTask(10000) { +// println("定时任务执行: ${System.currentTimeMillis()}") +// // 这里可以执行你的业务逻辑 +// } +// +// // 示例2:先延迟5秒,然后每隔3秒执行一次 +// val job2 = executor.startIntervalTaskWithInitialDelay(5000, 3000) { +// println("带初始延迟的定时任务: ${System.currentTimeMillis()}") +// } +// +// // 运行30秒后取消任务 +// delay(30000) +// job1.cancel() +// job2.cancel() +// println("所有定时任务已取消") +//} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login_face.xml b/app/src/main/res/layout/activity_login_face.xml index 1877e49..b921499 100644 --- a/app/src/main/res/layout/activity_login_face.xml +++ b/app/src/main/res/layout/activity_login_face.xml @@ -141,27 +141,27 @@ - + + + + + + + + + - + + + + + + + + + + +