refactor(main): 将Thread替换为lifecycleScope并优化协程处理

- 替换CollectFragment中的Thread为activity.lifecycleScope.launch
- 在MainActivity中添加FaceServer相关依赖和协程调度器
- 修改环境切换对话框以支持人脸数据重置功能
- 将照片拍摄和食物向量保存操作从Thread迁移到lifecycleScope
- 优化人脸识别数据更新逻辑,移除不必要的线程创建
- 修改onTakePhotoSuccess方法为suspend函数并调整UI更新方式
- 更新主线程操作使用withContext(Dispatchers.Main)替代runOnUiThread
- 在MainScreenPresentation中添加相机暂停功能
- 修复SensorScaleUtils中标定调用问题
- 扩展UserViewModel的人脸数据获取接口,支持回调处理
This commit is contained in:
2026-04-02 17:35:37 +08:00
parent 12da153df3
commit 5479091959
5 changed files with 111 additions and 78 deletions
@@ -68,10 +68,14 @@ import com.sw.plate.utils.LightManager
import com.sw.plate.utils.ToastUtils
import com.sw.plate.utils.arcface.facedb.FaceDatabase
import com.sw.plate.utils.arcface.facedb.entity.FaceEntity
import com.sw.plate.utils.arcface.faceserver.FaceServer
import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.greenrobot.eventbus.Subscribe
@@ -205,7 +209,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
updateDateTime()
binding.tvTitleTime.setOnClickListener {
EnvSwitchDialog(this).show()
EnvSwitchDialog(context = this, onEnvChanged = {
showWaitingDialog("重置人脸数据中……")
FaceServer.getInstance().clearAllFaces()
viewModel.getUserFaceCache(pageNo = 1, onSuccess = {
hideWaitingDialog()
ToastUtils.showToast("人脸数据已更新")
}, onFailure = { errMsg ->
ToastUtils.showToast(errMsg)
})
}).show()
}
binding.ivSetting.setOnClickListener {
isRefreshPage = false
@@ -410,12 +423,19 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
LightManager.closeRedLight()
LightManager.openGreenLight()
showWaitingDialog("识别中,请稍后……")
lifecycleScope.launch {
delay(5000)
withContext(Dispatchers.Main) {
hideWaitingDialog()
}
}
takePhoto(successCallback = { photoUri ->
Thread {
lifecycleScope.launch {
onTakePhotoSuccess(photoUri)
}.start()
}
failCount = 0
}, failureCallback = {
log("registerDataChange main,拍照异常,请重试")
//ToastUtils.showToast("拍照异常,请重试")
failCount++
hideWaitingDialog()
@@ -809,9 +829,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
if (checkedItem?.isFromSearch == true) {
//当前菜名为手动搜索选择,非识别结果,保存向量数据
Thread {
lifecycleScope.launch {
saveFoodVector(checkedItem!!)
}.start()
}
}
}, 300)
}
@@ -1074,44 +1094,44 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
if (list.isEmpty()) {
return@runOnUiThread
}
updateFaceData(list)
lifecycleScope.launch {
updateFaceData(list)
}
}
})
}
}
private fun updateFaceData(list: List<UserFaceModel>) {
Thread {
val faceList = mutableListOf<FaceEntity>()
try {
list.forEach { model ->
if (model.faceDeleted == true) {
//删除数据
FaceDatabase.getInstance(this).faceDao().deleteFaceById(model.userId)
} else {
//保存数据
val faceEntity = FaceEntity(
model.userId, null, Base64.decode(model.faceFeatureStr)
).also {
//1-会员、2-临时用户
it.userType = if (model.member) "1" else "2"
it.cardNo = model.cardNo
}
faceList.add(faceEntity)
val faceList = mutableListOf<FaceEntity>()
try {
list.forEach { model ->
if (model.faceDeleted == true) {
//删除数据
FaceDatabase.getInstance(this).faceDao().deleteFaceById(model.userId)
} else {
//保存数据
val faceEntity = FaceEntity(
model.userId, null, Base64.decode(model.faceFeatureStr)
).also {
//1-会员、2-临时用户
it.userType = if (model.member) "1" else "2"
it.cardNo = model.cardNo
}
faceList.add(faceEntity)
}
} catch (e: Exception) {
e.printStackTrace()
}
try {
if (faceList.isNotEmpty()) {
FaceDatabase.getInstance(this).faceDao().insert(faceList)
}
recognizeViewModel.refreshFaceList();
} catch (e: Exception) {
e.printStackTrace()
} catch (e: Exception) {
e.printStackTrace()
}
try {
if (faceList.isNotEmpty()) {
FaceDatabase.getInstance(this).faceDao().insert(faceList)
}
}.start()
recognizeViewModel.refreshFaceList();
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun sendFaceData(faceData: String) {
@@ -1125,16 +1145,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
private var tcpClient: TcpClient? = null
private fun onTakePhotoSuccess(photoUri: Uri) {
private suspend fun onTakePhotoSuccess(photoUri: Uri) {
lastPhotoUri = photoUri
log("registerDataChange main,takePhoto耗时:${System.currentTimeMillis() - startTime}")
startTime = System.currentTimeMillis()
log("registerDataChange photoUri = ${photoUri.path}")
// viewModel.getIdentifiedFoodList()
lifecycleScope.launch {
ImageUtil.uriToBitmap(this@MainActivity, photoUri)?.let { bitmap ->
queryFoodData(bitmap)
}
ImageUtil.uriToBitmap(this@MainActivity, photoUri)?.let { bitmap ->
queryFoodData(bitmap)
}
}
@@ -1163,7 +1181,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
hideWaitingDialog()
log("registerDataChange photoUri 识别数据名称:$foodName")
runOnUiThread {
withContext(Dispatchers.Main) {
binding.flPay.run {
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
@@ -1176,7 +1194,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
LightManager.closeRedLight()
//binding.layoutRescan.visibility = View.VISIBLE
runOnUiThread {
withContext(Dispatchers.Main) {
binding.tvToSearch.let {
it.text = "未识别到,手动搜索"
it.visible()