2025-08-27 18:32:51 +08:00
|
|
|
|
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()
|
|
|
|
|
|
|
2025-09-03 11:49:53 +08:00
|
|
|
|
// 重置AI相关ViewModel(完全清理,包括推荐数据)
|
2025-09-01 15:36:22 +08:00
|
|
|
|
AgentViewModel.ResetModel()
|
2025-08-27 18:32:51 +08:00
|
|
|
|
|
|
|
|
|
|
HotAgentViewModel.let {
|
|
|
|
|
|
it.agentList = emptyList()
|
|
|
|
|
|
it.refreshing = false
|
|
|
|
|
|
it.isLoading = false
|
|
|
|
|
|
it.hasNext = true
|
|
|
|
|
|
it.currentPage = 1
|
|
|
|
|
|
it.error = null
|
|
|
|
|
|
it.clearPreloadedImages()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-01 15:36:22 +08:00
|
|
|
|
MineAgentViewModel.ResetModel()
|
2025-08-27 18:32:51 +08:00
|
|
|
|
|
|
|
|
|
|
// 重置动态相关ViewModel
|
|
|
|
|
|
TimelineMomentViewModel.ResetModel()
|
|
|
|
|
|
DynamicViewModel.ResetModel()
|
2025-09-03 14:59:47 +08:00
|
|
|
|
HotMomentViewModel.resetModel()
|
2025-08-27 18:32:51 +08:00
|
|
|
|
|
|
|
|
|
|
// 重置个人资料相关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 页面类型
|
2025-09-03 11:49:53 +08:00
|
|
|
|
* @param preserveRecommendedData 是否保留推荐数据,默认为true
|
2025-08-27 18:32:51 +08:00
|
|
|
|
*/
|
2025-09-03 11:49:53 +08:00
|
|
|
|
fun cleanupPageResources(pageType: String, preserveRecommendedData: Boolean = true) {
|
2025-08-27 18:32:51 +08:00
|
|
|
|
when (pageType) {
|
|
|
|
|
|
"ai" -> {
|
2025-09-03 11:49:53 +08:00
|
|
|
|
// 如果需要保留推荐数据,则不重置AgentViewModel(它包含推荐Agent数据)
|
|
|
|
|
|
if (!preserveRecommendedData) {
|
|
|
|
|
|
AgentViewModel.ResetModel()
|
|
|
|
|
|
}
|
2025-08-27 18:32:51 +08:00
|
|
|
|
HotAgentViewModel.let {
|
|
|
|
|
|
it.agentList = emptyList()
|
|
|
|
|
|
it.refreshing = false
|
|
|
|
|
|
it.isLoading = false
|
|
|
|
|
|
it.hasNext = true
|
|
|
|
|
|
it.currentPage = 1
|
|
|
|
|
|
it.error = null
|
|
|
|
|
|
it.clearPreloadedImages()
|
|
|
|
|
|
}
|
2025-09-01 15:36:22 +08:00
|
|
|
|
MineAgentViewModel.ResetModel()
|
2025-08-27 18:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
"moment" -> {
|
|
|
|
|
|
TimelineMomentViewModel.ResetModel()
|
|
|
|
|
|
DynamicViewModel.ResetModel()
|
2025-09-03 14:59:47 +08:00
|
|
|
|
HotMomentViewModel.resetModel()
|
2025-08-27 18:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
"profile" -> {
|
|
|
|
|
|
MyProfileViewModel.ResetModel()
|
|
|
|
|
|
}
|
|
|
|
|
|
"search" -> {
|
|
|
|
|
|
// DiscoverViewModel的属性是私有的,无法直接访问
|
|
|
|
|
|
SearchViewModel.ResetModel()
|
|
|
|
|
|
}
|
|
|
|
|
|
"message" -> {
|
|
|
|
|
|
MessageListViewModel.ResetModel()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-03 11:49:53 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 完全清理AI页面资源(包括推荐数据),用于登出等场景
|
|
|
|
|
|
*/
|
|
|
|
|
|
fun cleanupAiPageCompletely() {
|
|
|
|
|
|
cleanupPageResources("ai", preserveRecommendedData = false)
|
|
|
|
|
|
}
|
2025-08-27 18:32:51 +08:00
|
|
|
|
}
|