From 16fe64e9fe9fe21301353f91ce7b8344fde9d0cc Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Thu, 23 Apr 2026 08:56:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(viewmodel):=20=E4=BF=AE=E5=A4=8D=20loa?= =?UTF-8?q?dSeasoning=20=E9=98=B2=E9=87=8D=E5=85=A5=E7=BC=BA=E9=99=B7?= =?UTF-8?q?=E5=B9=B6=E7=A7=BB=E9=99=A4=20BaseActivity=20=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E5=8C=85=E8=A3=85=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AppViewModel.loadSeasoning 用 Mutex 替换 isProcessing 标志位,避免异常时状态永久锁死 - 删除 BaseActivity 中 queryGoodsList / querySeasoningList 包装方法,减少隐式依赖 - FoodSearchDialog / SeasoningSearchDialog 改为直接调用 activity.netViewModel.xxx() Co-Authored-By: Claude Sonnet 4.6 --- .../com/shuwei/dish/match/base/BaseActivity.kt | 18 ------------------ .../dish/match/dialog/FoodSearchDialog.kt | 2 +- .../dish/match/dialog/SeasoningSearchDialog.kt | 2 +- .../dish/match/viewmodel/AppViewModel.kt | 13 +++++++------ 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/shuwei/dish/match/base/BaseActivity.kt b/app/src/main/java/com/shuwei/dish/match/base/BaseActivity.kt index 3070655..6f26be9 100644 --- a/app/src/main/java/com/shuwei/dish/match/base/BaseActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/base/BaseActivity.kt @@ -21,8 +21,6 @@ import androidx.core.view.WindowInsetsControllerCompat import com.shuwei.dish.match.R import com.shuwei.dish.match.databinding.ActivityBaseBinding import com.shuwei.dish.match.dialog.Loading -import com.shuwei.dish.match.entity.CookFoodGoodsEntity -import com.shuwei.dish.match.entity.SeasoningEntity import com.shuwei.dish.match.net.NetViewModel import com.shuwei.dish.match.ui.InitActivity import com.shuwei.dish.match.utils.ActivityManager @@ -183,22 +181,6 @@ open class BaseActivity : AppCompatActivity() { val netViewModel: NetViewModel by viewModels() - fun queryGoodsList( - param: MutableMap, - onSuccess: (MutableList?) -> Unit, - onFailure: (String, String) -> Unit - ) { - netViewModel.queryGoodsList(param, onSuccess, onFailure) - } - - fun querySeasoningList( - param: MutableMap, - onSuccess: (MutableList?) -> Unit, - onFailure: (String, String) -> Unit - ) { - netViewModel.querySeasoningList(param, onSuccess, onFailure) - } - private var permissionCallback: ((isGranted: Boolean) -> Unit)? = null private var activityCallback: ((intent: Intent?) -> Unit)? = null diff --git a/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt b/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt index c7f2a8c..4b16567 100644 --- a/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt +++ b/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt @@ -130,7 +130,7 @@ class FoodSearchDialog( if (!goodsName.isNullOrBlank()) { param["goodsName"] = goodsName!! } - activity.queryGoodsList(param = param, onSuccess = { + activity.netViewModel.queryGoodsList(param = param, onSuccess = { loadGoodsList(it) }, onFailure = { _, msg -> activity.toast(msg) diff --git a/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSearchDialog.kt b/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSearchDialog.kt index 0c0c94b..b4a3174 100644 --- a/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSearchDialog.kt +++ b/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSearchDialog.kt @@ -181,7 +181,7 @@ class SeasoningSearchDialog( if (!goodsName.isNullOrBlank()) { param["goodsName"] = goodsName!! } - activity.querySeasoningList(param = param, onSuccess = { + activity.netViewModel.querySeasoningList(param = param, onSuccess = { loadGoodsList(it) }, onFailure = { _, msg -> activity.toast(msg) diff --git a/app/src/main/java/com/shuwei/dish/match/viewmodel/AppViewModel.kt b/app/src/main/java/com/shuwei/dish/match/viewmodel/AppViewModel.kt index 166ec14..2e8912d 100644 --- a/app/src/main/java/com/shuwei/dish/match/viewmodel/AppViewModel.kt +++ b/app/src/main/java/com/shuwei/dish/match/viewmodel/AppViewModel.kt @@ -7,6 +7,8 @@ import com.shuwei.dish.match.entity.CookFoodEntity import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.entity.SeasoningEntity import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlin.collections.forEach class AppViewModel(private val rep: AppRepository) : ViewModel() { @@ -149,14 +151,13 @@ class AppViewModel(private val rep: AppRepository) : ViewModel() { // } // } - private var isProcessing = false + private val loadSeasoningMutex = Mutex() fun loadSeasoning(action: (MutableList) -> Unit) { + if (loadSeasoningMutex.isLocked) return viewModelScope.launch { - if (isProcessing) return@launch - isProcessing = true - val list = rep.getAllStream() - action(list) - isProcessing = false + loadSeasoningMutex.withLock { + action(rep.getAllStream()) + } } }