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() - } }