优化
This commit is contained in:
@@ -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<ActivityLoginFaceBinding>(),
|
||||
// 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<ActivityLoginFaceBinding>(),
|
||||
SpTool.savePlateData(items)
|
||||
|
||||
// debouncer.reset()
|
||||
//recognizeViewModel.recognizeUserId.postValue(CompareResult(null,0f))
|
||||
}
|
||||
// }
|
||||
}
|
||||
@@ -343,8 +348,10 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
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<ActivityLoginFaceBinding>(),
|
||||
if (facePreviewInfoList.isNullOrEmpty()) {
|
||||
currentPlateInfo = null
|
||||
currentUserId = null
|
||||
// checkFaceJob?.cancel()
|
||||
// getFaceJob?.cancel()
|
||||
}
|
||||
recognizeViewModel.clearLeftFace(facePreviewInfoList)
|
||||
}
|
||||
@@ -552,23 +561,28 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
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<ActivityLoginFaceBinding>(),
|
||||
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<ActivityLoginFaceBinding>(),
|
||||
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<String> = mutableListOf()
|
||||
|
||||
private fun loadLogInfo(msg: String) {
|
||||
Log.d(TAG, msg)
|
||||
// logAdapter.addData(msg)
|
||||
@@ -678,7 +711,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
private var facePreviewInfoList: MutableList<FacePreviewInfo>? = 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<ActivityLoginFaceBinding>(),
|
||||
|
||||
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<ActivityLoginFaceBinding>(),
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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("所有定时任务已取消")
|
||||
}
|
||||
//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("所有定时任务已取消")
|
||||
//}
|
||||
@@ -141,27 +141,27 @@
|
||||
<!-- tools:ignore="HardcodedText" />-->
|
||||
<!-- </LinearLayout>-->
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rvLogInfo"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
android:overScrollMode="never"
|
||||
android:visibility="gone"
|
||||
android:background="@color/black"
|
||||
tools:listitem="@layout/list_item_log_info" />
|
||||
<!-- <androidx.recyclerview.widget.RecyclerView-->
|
||||
<!-- android:id="@+id/rvLogInfo"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="match_parent"-->
|
||||
<!-- android:layout_gravity="bottom"-->
|
||||
<!-- android:overScrollMode="never"-->
|
||||
<!-- android:visibility="gone"-->
|
||||
<!-- android:background="@color/black"-->
|
||||
<!-- tools:listitem="@layout/list_item_log_info" />-->
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/btnLogState"
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="60dp"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:background="@drawable/shape_white_circle"
|
||||
android:padding="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:src="@drawable/ic_log_show"
|
||||
android:textSize="16sp" />
|
||||
<!-- <ImageView-->
|
||||
<!-- android:id="@+id/btnLogState"-->
|
||||
<!-- android:layout_width="60dp"-->
|
||||
<!-- android:layout_height="60dp"-->
|
||||
<!-- android:layout_gravity="bottom|end"-->
|
||||
<!-- android:background="@drawable/shape_white_circle"-->
|
||||
<!-- android:padding="10dp"-->
|
||||
<!-- android:layout_marginEnd="10dp"-->
|
||||
<!-- android:layout_marginBottom="10dp"-->
|
||||
<!-- android:src="@drawable/ic_log_show"-->
|
||||
<!-- android:textSize="16sp" />-->
|
||||
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
|
||||
Reference in New Issue
Block a user