diff --git a/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt b/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt index 6a52ba7..7910490 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt @@ -97,7 +97,7 @@ fun AccountEditScreen2() { ) { //StatusBarSpacer() Box( - modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp) + modifier = Modifier.padding(horizontal = 0.dp, vertical = 16.dp) ) { NoticeScreenHeader( title = stringResource(R.string.edit_profile), diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt index bcee8aa..1b2b684 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt @@ -37,6 +37,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -73,6 +74,7 @@ import com.aiosman.ravenow.ui.index.tabs.shorts.ShortVideo import com.aiosman.ravenow.ui.index.tabs.street.StreetPage import com.aiosman.ravenow.ui.modifiers.noRippleClickable import com.aiosman.ravenow.ui.post.NewPostViewModel +import com.aiosman.ravenow.utils.ResourceCleanupManager import com.google.accompanist.systemuicontroller.rememberSystemUiController import kotlinx.coroutines.launch @@ -97,6 +99,13 @@ fun IndexScreen() { val coroutineScope = rememberCoroutineScope() val drawerState = rememberDrawerState(DrawerValue.Closed) val context = LocalContext.current + + // 页面退出时清理所有资源 + DisposableEffect(Unit) { + onDispose { + ResourceCleanupManager.cleanupAllResources(context) + } + } LaunchedEffect(Unit) { systemUiController.setNavigationBarColor(Color.Transparent) } @@ -363,9 +372,19 @@ fun IndexScreen() { @Composable fun Home() { val systemUiController = rememberSystemUiController() + val context = LocalContext.current + LaunchedEffect(AppState.darkMode) { systemUiController.setStatusBarColor(Color.Transparent, darkIcons = !AppState.darkMode) } + + // 页面退出时清理动态相关资源 + DisposableEffect(Unit) { + onDispose { + ResourceCleanupManager.cleanupPageResources("moment") + } + } + Column( modifier = Modifier .fillMaxSize(), @@ -380,9 +399,19 @@ fun Home() { @Composable fun Street() { val systemUiController = rememberSystemUiController() + val context = LocalContext.current + LaunchedEffect(AppState.darkMode) { systemUiController.setStatusBarColor(Color.Transparent, darkIcons = !AppState.darkMode) } + + // 页面退出时清理搜索相关资源 + DisposableEffect(Unit) { + onDispose { + ResourceCleanupManager.cleanupPageResources("search") + } + } + Column( modifier = Modifier .fillMaxSize(), @@ -430,9 +459,19 @@ fun Video() { @Composable fun Profile() { val systemUiController = rememberSystemUiController() + val context = LocalContext.current + LaunchedEffect(AppState.darkMode) { systemUiController.setStatusBarColor(Color.Transparent, !AppState.darkMode) } + + // 页面退出时清理个人资料相关资源 + DisposableEffect(Unit) { + onDispose { + ResourceCleanupManager.cleanupPageResources("profile") + } + } + Column( modifier = Modifier .fillMaxSize(), @@ -446,9 +485,19 @@ fun Profile() { @Composable fun Notifications() { val systemUiController = rememberSystemUiController() + val context = LocalContext.current + LaunchedEffect(AppState.darkMode) { systemUiController.setStatusBarColor(Color.Transparent, !AppState.darkMode) } + + // 页面退出时清理消息相关资源 + DisposableEffect(Unit) { + onDispose { + ResourceCleanupManager.cleanupPageResources("message") + } + } + Column( modifier = Modifier .fillMaxSize(), diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/Agent.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/Agent.kt index 89237a1..ee3d33f 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/Agent.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/Agent.kt @@ -28,7 +28,12 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -53,6 +58,8 @@ import com.aiosman.ravenow.ui.composables.TabItem import com.aiosman.ravenow.ui.composables.TabSpacer import com.aiosman.ravenow.ui.index.tabs.moment.tabs.expolre.AgentItem import com.aiosman.ravenow.ui.index.tabs.moment.tabs.expolre.ExploreViewModel +import com.aiosman.ravenow.utils.DebounceUtils +import com.aiosman.ravenow.utils.ResourceCleanupManager import kotlinx.coroutines.launch @OptIn( ExperimentalFoundationApi::class) @@ -67,6 +74,16 @@ fun Agent() { var scope = rememberCoroutineScope() val viewModel: AgentViewModel = viewModel() + + // 防抖状态 + var lastClickTime by remember { mutableStateOf(0L) } + + // 页面退出时清理AI相关资源 + DisposableEffect(Unit) { + onDispose { + ResourceCleanupManager.cleanupPageResources("ai") + } + } Column( modifier = Modifier @@ -119,11 +136,15 @@ fun Agent() { modifier = Modifier .size(36.dp) .noRippleClickable { - // 设置标志,表示新增智能体后不需要刷新 - com.aiosman.ravenow.ui.agent.AddAgentViewModel.isFromAddAgent = true - navController.navigate( - NavigationRoute.AddAgent.route - ) + if (DebounceUtils.simpleDebounceClick(lastClickTime, 500L) { + // 设置标志,表示新增智能体后不需要刷新 + com.aiosman.ravenow.ui.agent.AddAgentViewModel.isFromAddAgent = true + navController.navigate( + NavigationRoute.AddAgent.route + ) + }) { + lastClickTime = System.currentTimeMillis() + } }, painter = painterResource(id = R.drawable.rider_pro_new_post_add_pic), contentDescription = null, @@ -189,8 +210,12 @@ fun Agent() { text = stringResource(R.string.agent_mine), isSelected = pagerState.currentPage == 0, onClick = { - scope.launch { - pagerState.animateScrollToPage(0) + if (DebounceUtils.simpleDebounceClick(lastClickTime, 300L) { + scope.launch { + pagerState.animateScrollToPage(0) + } + }) { + lastClickTime = System.currentTimeMillis() } } ) @@ -199,8 +224,12 @@ fun Agent() { text = stringResource(R.string.agent_hot), isSelected = pagerState.currentPage == 1, onClick = { - scope.launch { - pagerState.animateScrollToPage(1) + if (DebounceUtils.simpleDebounceClick(lastClickTime, 300L) { + scope.launch { + pagerState.animateScrollToPage(1) + } + }) { + lastClickTime = System.currentTimeMillis() } } ) @@ -347,6 +376,9 @@ fun AgentPage(viewModel: AgentViewModel,agentItems: List, page: Int, @Composable fun AgentCard2(viewModel: AgentViewModel,agentItem: AgentItem,navController: NavHostController) { val AppColors = LocalAppTheme.current + + // 防抖状态 + var lastClickTime by remember { mutableStateOf(0L) } Row( modifier = Modifier @@ -419,8 +451,12 @@ fun AgentCard2(viewModel: AgentViewModel,agentItem: AgentItem,navController: Nav shape = RoundedCornerShape(8.dp) ) .clickable { - /* viewModel.createSingleChat(agentItem.trtcId) - viewModel.goToChatAi(agentItem.trtcId, navController = navController)*/ + if (DebounceUtils.simpleDebounceClick(lastClickTime, 500L) { + /* viewModel.createSingleChat(agentItem.trtcId) + viewModel.goToChatAi(agentItem.trtcId, navController = navController)*/ + }) { + lastClickTime = System.currentTimeMillis() + } }, contentAlignment = Alignment.Center ) { diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/hot/HotAgent.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/hot/HotAgent.kt index 7471d51..b0a4a7b 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/hot/HotAgent.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/hot/HotAgent.kt @@ -60,8 +60,9 @@ fun HotAgent() { } } - // 只在首次加载时刷新,避免从AddAgent返回时重复刷新 + // 只在初始化页面时刷新 LaunchedEffect(Unit) { + // 只有在列表完全为空且没有正在加载时才进行初始化刷新 if (model.agentList.isEmpty() && !model.isLoading) { model.refreshPager() } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt index 621388b..ac92544 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt @@ -53,8 +53,9 @@ fun MineAgent() { // Paging 库会自动处理加载更多,无需手动监听滚动 - // 只在首次加载时刷新,避免从AddAgent返回时重复刷新 + // 只在初始化页面时刷新 LaunchedEffect(Unit) { + // 只有在列表完全为空且没有正在加载时才进行初始化刷新 if (agentList.itemCount == 0 && !model.isLoading) { model.refreshPager() } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt index 3d1fd7e..1fe61eb 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt @@ -25,7 +25,6 @@ import com.aiosman.ravenow.entity.MomentPagingSource import com.aiosman.ravenow.entity.MomentRemoteDataSource import com.aiosman.ravenow.entity.MomentServiceImpl import com.aiosman.ravenow.ui.index.tabs.message.MessageListViewModel.userService -import com.aiosman.ravenow.ui.index.tabs.moment.tabs.hot.HotMomentViewModel.firstLoad import com.aiosman.ravenow.ui.navigateToChatAi import com.tencent.imsdk.v2.V2TIMConversationOperationResult import com.tencent.imsdk.v2.V2TIMManager @@ -47,6 +46,7 @@ object MineAgentViewModel : ViewModel() { var hasNext by mutableStateOf(true) var currentPage by mutableStateOf(1) var error by mutableStateOf(null) + var isFirstLoad by mutableStateOf(true) // 记录已预加载的图片ID,避免重复加载 private val preloadedImageIds = mutableSetOf() @@ -55,10 +55,10 @@ object MineAgentViewModel : ViewModel() { fun refreshPager() { - if (!firstLoad) { + if (!isFirstLoad) { return } - firstLoad = false + isFirstLoad = false viewModelScope.launch { Pager( config = PagingConfig(pageSize = 5, enablePlaceholders = false), diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/MessageList.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/MessageList.kt index 01b0312..70d3110 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/MessageList.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/MessageList.kt @@ -29,6 +29,7 @@ import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.Icon import androidx.compose.material.pullrefresh.PullRefreshIndicator import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.rememberPullRefreshState @@ -179,30 +180,36 @@ fun NotificationsScreen() { .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 8.dp) .height(40.dp) - .background( - color = Color(0xFFF5F5F5), - shape = RoundedCornerShape(8.dp) - ) - .noRippleClickable {//添加搜索逻辑实现 + + .noRippleClickable { }, contentAlignment = Alignment.CenterStart ) { Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 16.dp) + modifier = Modifier + .height(36.dp) + .fillMaxWidth() + .clip(shape = RoundedCornerShape(8.dp)) + .background(AppColors.inputBackground) + .padding(horizontal = 8.dp, vertical = 0.dp) + .noRippleClickable { + // 搜索框点击事件 + }, + verticalAlignment = Alignment.CenterVertically ) { - Image( - painter = painterResource(id = R.drawable.rider_pro_search_location), - contentDescription = "search", - modifier = Modifier.size(20.dp), - colorFilter = ColorFilter.tint(Color(0xFF999999)) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(R.string.search), - fontSize = 14.sp, - color = Color(0xFF999999) + Icon( + painter = painterResource(id = R.drawable.rider_pro_nav_search), + contentDescription = null, + tint = AppColors.inputHint ) + Box { + androidx.compose.material.Text( + text = stringResource(R.string.search), + modifier = Modifier.padding(start = 8.dp), + color = AppColors.inputHint, + fontSize = 17.sp + ) + } } } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt b/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt index 053c0fa..a5744ba 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt @@ -410,6 +410,7 @@ fun NewPostTextField(hint: String, value: String, onValueChange: (String) -> Uni value = value, onValueChange = onValueChange, modifier = Modifier + .fillMaxWidth() .height(160.dp) .heightIn(160.dp) .padding(horizontal = 16.dp, vertical = 10.dp), diff --git a/app/src/main/java/com/aiosman/ravenow/utils/DebounceUtils.kt b/app/src/main/java/com/aiosman/ravenow/utils/DebounceUtils.kt new file mode 100644 index 0000000..a28dad5 --- /dev/null +++ b/app/src/main/java/com/aiosman/ravenow/utils/DebounceUtils.kt @@ -0,0 +1,78 @@ +package com.aiosman.ravenow.utils + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import java.util.concurrent.atomic.AtomicBoolean + +/** + * 防抖工具类 + * 用于防止用户快速重复点击 + */ +object DebounceUtils { + + /** + * 防抖点击处理 + * @param scope 协程作用域 + * @param delayMillis 防抖延迟时间(毫秒),默认500ms + * @param action 要执行的操作 + */ + fun debounceClick( + scope: CoroutineScope, + delayMillis: Long = 500L, + action: () -> Unit + ) { + scope.launch { + delay(delayMillis) + action() + } + } + + /** + * 带状态检查的防抖点击处理 + * @param scope 协程作用域 + * @param delayMillis 防抖延迟时间(毫秒),默认500ms + * @param isProcessing 是否正在处理中的状态 + * @param action 要执行的操作 + */ + fun debounceClickWithState( + scope: CoroutineScope, + delayMillis: Long = 500L, + isProcessing: AtomicBoolean, + action: () -> Unit + ) { + if (isProcessing.get()) { + return + } + + isProcessing.set(true) + scope.launch { + delay(delayMillis) + try { + action() + } finally { + isProcessing.set(false) + } + } + } + + /** + * 简单的防抖点击处理(无协程) + * @param lastClickTime 上次点击时间 + * @param delayMillis 防抖延迟时间(毫秒),默认500ms + * @param action 要执行的操作 + * @return 是否执行了操作 + */ + fun simpleDebounceClick( + lastClickTime: Long, + delayMillis: Long = 500L, + action: () -> Unit + ): Boolean { + val currentTime = System.currentTimeMillis() + if (currentTime - lastClickTime < delayMillis) { + return false + } + action() + return true + } +} diff --git a/app/src/main/java/com/aiosman/ravenow/utils/ResourceCleanupManager.kt b/app/src/main/java/com/aiosman/ravenow/utils/ResourceCleanupManager.kt new file mode 100644 index 0000000..f0229a2 --- /dev/null +++ b/app/src/main/java/com/aiosman/ravenow/utils/ResourceCleanupManager.kt @@ -0,0 +1,258 @@ +package com.aiosman.ravenow.utils + +import android.content.Context +import android.content.Intent +import com.aiosman.ravenow.AppState +import com.aiosman.ravenow.ui.index.IndexViewModel +import com.aiosman.ravenow.ui.index.tabs.ai.AgentViewModel +import com.aiosman.ravenow.ui.index.tabs.ai.tabs.hot.HotAgentViewModel +import com.aiosman.ravenow.ui.index.tabs.ai.tabs.mine.MineAgentViewModel +import com.aiosman.ravenow.ui.index.tabs.moment.tabs.dynamic.DynamicViewModel +import com.aiosman.ravenow.ui.index.tabs.moment.tabs.hot.HotMomentViewModel +import com.aiosman.ravenow.ui.index.tabs.moment.tabs.timeline.TimelineMomentViewModel +import com.aiosman.ravenow.ui.index.tabs.profile.MyProfileViewModel +import com.aiosman.ravenow.ui.index.tabs.search.DiscoverViewModel +import com.aiosman.ravenow.ui.index.tabs.search.SearchViewModel +import com.aiosman.ravenow.ui.index.tabs.message.MessageListViewModel +import com.aiosman.ravenow.ui.like.LikeNoticeViewModel +import com.aiosman.ravenow.ui.favourite.FavouriteListViewModel +import com.aiosman.ravenow.ui.favourite.FavouriteNoticeViewModel +import com.aiosman.ravenow.ui.follower.FollowerNoticeViewModel +import com.aiosman.ravenow.ui.post.NewPostViewModel +import com.aiosman.ravenow.ui.imageviewer.ImageViewerViewModel +import org.greenrobot.eventbus.EventBus + +/** + * 资源清理管理器 + * 用于在Index页面退出时清理所有相关资源 + */ +object ResourceCleanupManager { + + /** + * 清理所有Index页面相关的资源 + * @param context 上下文 + */ + fun cleanupAllResources(context: Context) { + try { + // 1. 清理ViewModel资源 + cleanupViewModels() + + // 2. 清理EventBus注册 + cleanupEventBus() + + // 3. 清理服务 + cleanupServices(context) + + // 4. 清理缓存和临时数据 + cleanupCacheAndTempData() + + // 5. 重置应用状态 + resetAppState() + + } catch (e: Exception) { + // 记录错误但不抛出异常,确保清理过程不会中断 + e.printStackTrace() + } + } + + /** + * 清理所有ViewModel资源 + */ + private fun cleanupViewModels() { + // 重置Index相关ViewModel + IndexViewModel.ResetModel() + + // 重置AI相关ViewModel + // AgentViewModel的属性是私有的,无法直接访问,通过其他方式清理 + + HotAgentViewModel.let { + it.agentList = emptyList() + it.refreshing = false + it.isLoading = false + it.hasNext = true + it.currentPage = 1 + it.error = null + it.clearPreloadedImages() + } + + MineAgentViewModel.let { + it.refreshing = false + it.isLoading = false + it.hasNext = true + it.currentPage = 1 + it.error = null + } + + // 重置动态相关ViewModel + TimelineMomentViewModel.ResetModel() + DynamicViewModel.ResetModel() + HotMomentViewModel.ResetModel() + + // 重置个人资料相关ViewModel + MyProfileViewModel.ResetModel() + + // 重置搜索相关ViewModel + // DiscoverViewModel的属性是私有的,无法直接访问,通过其他方式清理 + + SearchViewModel.ResetModel() + + // 重置消息相关ViewModel + MessageListViewModel.ResetModel() + + // 重置通知相关ViewModel + LikeNoticeViewModel.ResetModel() + FavouriteNoticeViewModel.ResetModel() + FollowerNoticeViewModel.ResetModel() + + // 重置收藏相关ViewModel + FavouriteListViewModel.ResetModel() + + // 重置发布相关ViewModel + NewPostViewModel.asNewPost() + + // 重置图片查看器ViewModel + ImageViewerViewModel.let { + it.imageList.clear() + it.initialIndex = 0 + } + } + + /** + * 清理EventBus注册 + */ + private fun cleanupEventBus() { + try { + // 取消所有ViewModel的EventBus注册 + val eventBus = EventBus.getDefault() + + // 检查并取消注册各种ViewModel + if (eventBus.isRegistered(TimelineMomentViewModel)) { + eventBus.unregister(TimelineMomentViewModel) + } + if (eventBus.isRegistered(DynamicViewModel)) { + eventBus.unregister(DynamicViewModel) + } + if (eventBus.isRegistered(HotMomentViewModel)) { + eventBus.unregister(HotMomentViewModel) + } + if (eventBus.isRegistered(MyProfileViewModel)) { + eventBus.unregister(MyProfileViewModel) + } + if (eventBus.isRegistered(DiscoverViewModel)) { + eventBus.unregister(DiscoverViewModel) + } + if (eventBus.isRegistered(SearchViewModel)) { + eventBus.unregister(SearchViewModel) + } + if (eventBus.isRegistered(MessageListViewModel)) { + eventBus.unregister(MessageListViewModel) + } + if (eventBus.isRegistered(LikeNoticeViewModel)) { + eventBus.unregister(LikeNoticeViewModel) + } + if (eventBus.isRegistered(FavouriteListViewModel)) { + eventBus.unregister(FavouriteListViewModel) + } + if (eventBus.isRegistered(FavouriteNoticeViewModel)) { + eventBus.unregister(FavouriteNoticeViewModel) + } + if (eventBus.isRegistered(FollowerNoticeViewModel)) { + eventBus.unregister(FollowerNoticeViewModel) + } + } catch (e: Exception) { + // EventBus清理失败不影响其他清理 + e.printStackTrace() + } + } + + /** + * 清理服务 + */ + private fun cleanupServices(context: Context) { + try { + // 停止TRTC服务 + // val trtcService = Intent(context, TrtcService::class.java) + // context.stopService(trtcService) + } catch (e: Exception) { + // 服务停止失败不影响其他清理 + e.printStackTrace() + } + } + + /** + * 清理缓存和临时数据 + */ + private fun cleanupCacheAndTempData() { + try { + // 清理图片缓存 + // 这里可以添加图片缓存清理逻辑 + + // 清理临时文件 + // 这里可以添加临时文件清理逻辑 + + } catch (e: Exception) { + // 缓存清理失败不影响其他清理 + e.printStackTrace() + } + } + + /** + * 重置应用状态 + */ + private fun resetAppState() { + try { + // 重置用户ID + AppState.UserId = null + + // 重置其他应用状态 + // 这里可以添加其他应用状态的重置逻辑 + + } catch (e: Exception) { + // 状态重置失败不影响其他清理 + e.printStackTrace() + } + } + + /** + * 清理特定页面的资源 + * @param pageType 页面类型 + */ + fun cleanupPageResources(pageType: String) { + when (pageType) { + "ai" -> { + // AgentViewModel的属性是私有的,无法直接访问 + HotAgentViewModel.let { + it.agentList = emptyList() + it.refreshing = false + it.isLoading = false + it.hasNext = true + it.currentPage = 1 + it.error = null + it.clearPreloadedImages() + } + MineAgentViewModel.let { + it.refreshing = false + it.isLoading = false + it.hasNext = true + it.currentPage = 1 + it.error = null + } + } + "moment" -> { + TimelineMomentViewModel.ResetModel() + DynamicViewModel.ResetModel() + HotMomentViewModel.ResetModel() + } + "profile" -> { + MyProfileViewModel.ResetModel() + } + "search" -> { + // DiscoverViewModel的属性是私有的,无法直接访问 + SearchViewModel.ResetModel() + } + "message" -> { + MessageListViewModel.ResetModel() + } + } + } +}