From 3e5c7c6caac93d2d919d93f079181915526d2bd7 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Wed, 1 Apr 2026 14:19:45 +0800 Subject: [PATCH] =?UTF-8?q?refactor(HomeActivity):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复内存泄漏问题 - 在 onDestroy 中清理所有 Handler 回调 - 在 onDestroy 中释放 Dialog 引用 2. 增强类型安全 - updateUI 中增加类型检查和日志 - updateOverdueState 中增加完整的类型检查 3. 优化串口异常处理 - 串口数据处理异常时向用户提示 4. 消除代码重复 - 删除冗余的 saveShelfGoodsList 方法 - 定时任务直接调用 syncShelfGoodsToServer Co-Authored-By: Claude Sonnet 4.6 --- .../shelves/activity/HomeActivity.kt | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt index baf908a..ac73c00 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt @@ -132,7 +132,11 @@ class HomeActivity : BaseActivity() { // 切换到主线程协程处理串口数据 lifecycleScope.launch { runCatching { receiveSerialPortData(data) } - .onFailure { it.printStackTrace() } + .onFailure { + it.printStackTrace() + log("串口数据处理异常: ${it.message}") + toast("串口数据处理异常,请检查设备连接") + } } } } @@ -164,8 +168,21 @@ class HomeActivity : BaseActivity() { launch { viewModel.updateOverdueStateUiState.collect { state -> if (state is UiState.Success<*>) { - val respData = state.data as? com.shuwei.intelligent.shelves.net.RespData<*> ?: return@collect - val items = (respData.data as? ShelfResult)?.containerGoodsList ?: return@collect + val respData = state.data as? com.shuwei.intelligent.shelves.net.RespData<*> + if (respData == null) { + log("updateOverdueState: 数据类型错误,期望 RespData") + return@collect + } + val shelfResult = respData.data as? ShelfResult + if (shelfResult == null) { + log("updateOverdueState: 数据类型错误,期望 ShelfResult") + return@collect + } + val items = shelfResult.containerGoodsList + if (items.isNullOrEmpty()) { + log("updateOverdueState: 货架列表为空") + return@collect + } applyOverdueState(items) } } @@ -200,15 +217,17 @@ class HomeActivity : BaseActivity() { private fun updateUI(data: RespData<*>) { binding.include?.root?.gone() window?.decorView?.postDelayed({ Loading.dismiss() }, 500) - if (data.data !is ShelfResult) { + val shelfResult = data.data as? ShelfResult + if (shelfResult == null) { + log("updateUI: 数据类型错误,期望 ShelfResult,实际类型:${data.data?.javaClass?.simpleName}") loadEmptyView() return } - deviceName = data.data.deviceName + deviceName = shelfResult.deviceName updateLeftStatus(deviceName) - App.canteenId = data.data.placeId - val tempList = data.data.containerGoodsList + App.canteenId = shelfResult.placeId + val tempList = shelfResult.containerGoodsList if (tempList.isNullOrEmpty()) { loadEmptyView() return @@ -276,6 +295,15 @@ class HomeActivity : BaseActivity() { } override fun onDestroy() { + // 清理 Handler 所有回调,防止内存泄漏 + handler.removeCallbacksAndMessages(null) + + // 关闭并释放 Dialog 引用,防止内存泄漏 + tipDialog?.dismiss() + tipDialog = null + noDataWarningDialog?.dismiss() + noDataWarningDialog = null + SerialPortManager.close() saveTaskJob?.cancel() overdueTaskJob?.cancel() @@ -411,7 +439,7 @@ class HomeActivity : BaseActivity() { */ private fun saveGoodsTask() { saveTaskJob = taskExecutor.startIntervalTaskWithInitialDelay(1 * 60 * 1000L, 5 * 60 * 1000L) { - saveShelfGoodsList() + syncShelfGoodsToServer() } } @@ -449,6 +477,7 @@ class HomeActivity : BaseActivity() { * 构建 ShelfBody 并提交到服务端(被定时任务与 ShelfActivity 返回共用) */ private fun syncShelfGoodsToServer() { + log("performSync: list:${list.toJsonString()}") val submitList = list.sortedBy { it.deviceNo } submitList.forEach { if (it.goodsId.isNullOrBlank()) { @@ -465,9 +494,4 @@ class HomeActivity : BaseActivity() { log("performSync: body:${body.toJsonString()}") viewModel.saveShelfGoodsList(body) } - - private fun saveShelfGoodsList() { - log("performSync: list:${list.toJsonString()}") - syncShelfGoodsToServer() - } }