From e9a3e87fd8ecf8f47a5b847a917148c7c4611a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Fri, 17 Apr 2026 00:20:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor(chat):=20=E4=BC=98=E5=8C=96=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E5=8A=9F=E8=83=BD=E7=9A=84=E4=BC=9A=E8=AF=9D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=92=8C=E6=BB=9A=E5=8A=A8=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 demoPostSse 方法中的 topicId 参数,改为使用类成员变量 currentTopicId - 添加 currentTopicId 成员变量用于复用会话主题ID,避免重复请求 - 修改 prepareTopic 方法逻辑,统一管理 topicId 的获取和设置流程 - 更新 RecyclerView 滚动偏移量计算,添加额外像素补偿实现更精确定位 - 简化 SSE 请求流程,所有后续请求都复用首次获取的主题ID --- .../com/nova/brain/glass/ui/ChatActivity.kt | 7 ++++--- .../com/nova/brain/glass/viewmodel/ChatVM.kt | 18 +++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt index dbaf4f4..0a89d8c 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt @@ -64,7 +64,8 @@ class ChatActivity : BaseListFormLayoutNormalActivity(R.layout.item_chat) { @@ -106,10 +107,10 @@ class ChatActivity : BaseListFormLayoutNormalActivity - viewModel.prepareTopic(action.params.question) + viewModel.demoPostSse(action.params.question) } AsrHelper.onDirectChat = { text -> - viewModel.prepareTopic(text) + viewModel.demoPostSse(text) } } diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt index 8d4db3a..c691632 100644 --- a/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt @@ -39,6 +39,9 @@ class ChatVM : BaseListViewModel() { private var dataSourceReady = false private val mainHandler = Handler(Looper.getMainLooper()) + /** 进入页面时由 prepareTopic 设置,后续所有 demoPostSse 复用 */ + private var currentTopicId: Int = DEFAULT_TOPIC_ID + /** 最后一个真实 item 的索引(占位 item 之前) */ private val lastRealIndex get() = chatItems.size - 2 @@ -78,8 +81,8 @@ class ChatVM : BaseListViewModel() { } /** - * 先请求 tbtopic 接口拿 topicId,成功则使用返回值,失败/code≠0 则用默认值,再发起 SSE。 - * 进入 Chat 界面时用此方法替代直接调 demoPostSse。 + * 进入 Chat 页面时调用一次:请求 tbtopic 接口设置本次会话的 topicId, + * 成功(code==0)使用返回值,否则沿用默认值 14478,然后发起第一次 SSE。 */ fun prepareTopic(question: String) { HttpManager.getApi(Service::class.java) @@ -87,14 +90,15 @@ class ChatVM : BaseListViewModel() { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ model -> - val topicId = if (model.code == 0) model.data else DEFAULT_TOPIC_ID - demoPostSse(question, topicId) + currentTopicId = if (model.code == 0) model.data else DEFAULT_TOPIC_ID + demoPostSse(question) }, { _ -> - demoPostSse(question, DEFAULT_TOPIC_ID) + currentTopicId = DEFAULT_TOPIC_ID + demoPostSse(question) }).also { add(it) } } - fun demoPostSse(question: String, topicId: Int = DEFAULT_TOPIC_ID) { + fun demoPostSse(question: String) { currentTask?.dispose() currentTask = null stopThinkingAnimation() @@ -106,7 +110,7 @@ class ChatVM : BaseListViewModel() { result.postValue(UUID.randomUUID().toString()) loading.postValue(true) - currentTask = HttpManager.getApi(Service::class.java).chat(ChatData(question, topicId)) + currentTask = HttpManager.getApi(Service::class.java).chat(ChatData(question, currentTopicId)) .subscribeOn(Schedulers.io()) .subscribe({ body -> var content = ""