Files
rider-pro-android-app/app/src/main/java/com/aiosman/ravenow/utils/ResourceCleanupManager.kt
AllenTom ae7254163a Refactor: Add debounce for navigation and optimize comments loading
- Implemented debounced navigation to prevent multiple rapid navigations.
- Replaced Pager-based comment loading with a simpler list-based approach for improved performance and reduced complexity.
- Added loading and error states for comment fetching.
- Introduced `debouncedClickable` modifier for handling click events with debounce.
- Updated image viewer to use simple navigation arrows instead of HorizontalPager for better user experience.
- Added a new string resource for password length error.
2025-09-03 18:02:39 +08:00

263 lines
8.8 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.account.AccountEditViewModel
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.ResetModel()
HotAgentViewModel.let {
it.agentList = emptyList()
it.refreshing = false
it.isLoading = false
it.hasNext = true
it.currentPage = 1
it.error = null
it.clearPreloadedImages()
}
MineAgentViewModel.ResetModel()
// 重置动态相关ViewModel
TimelineMomentViewModel.ResetModel()
DynamicViewModel.ResetModel()
HotMomentViewModel.resetModel()
// 重置个人资料相关ViewModel
MyProfileViewModel.ResetModel()
// 重置编辑资料ViewModel - 暂时注释掉
// AccountEditViewModel.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 页面类型
* @param preserveRecommendedData 是否保留推荐数据默认为true
*/
fun cleanupPageResources(pageType: String, preserveRecommendedData: Boolean = true) {
when (pageType) {
"ai" -> {
// 如果需要保留推荐数据则不重置AgentViewModel它包含推荐Agent数据
if (!preserveRecommendedData) {
AgentViewModel.ResetModel()
}
HotAgentViewModel.let {
it.agentList = emptyList()
it.refreshing = false
it.isLoading = false
it.hasNext = true
it.currentPage = 1
it.error = null
it.clearPreloadedImages()
}
MineAgentViewModel.ResetModel()
}
"moment" -> {
TimelineMomentViewModel.ResetModel()
DynamicViewModel.ResetModel()
HotMomentViewModel.resetModel()
}
"profile" -> {
MyProfileViewModel.ResetModel()
// AccountEditViewModel.ResetModel() - 暂时注释掉
}
"search" -> {
// DiscoverViewModel的属性是私有的无法直接访问
SearchViewModel.ResetModel()
}
"message" -> {
MessageListViewModel.ResetModel()
}
}
}
/**
* 完全清理AI页面资源包括推荐数据用于登出等场景
*/
fun cleanupAiPageCompletely() {
cleanupPageResources("ai", preserveRecommendedData = false)
}
}