From 9ed1e317001a233d07179516b837ef41b0c2795a Mon Sep 17 00:00:00 2001 From: fengge <844143714@qq.com> Date: Wed, 3 Jun 2026 14:48:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96(=E6=9E=B6=E6=9E=84=E4=B8=8E?= =?UTF-8?q?=E6=B8=B2=E6=9F=93):=20=E6=8F=90=E5=8D=87=E6=B5=81=E5=BC=8F?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=80=A7=E8=83=BD=E5=B9=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20SP=20=E6=8C=81=E4=B9=85=E5=8C=96=E9=98=BB=E5=A1=9E=E4=B8=BB?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 将 ChatViewModel 中 AI 的流式刷新频率 (STREAM_FLUSH_INTERVAL_MS) 从 50ms 调整为 150ms,以降低低端机中高频触发文本重绘(Text Layout)的沉重 CPU 负担,肉眼仍旧保持平滑。 2. 将 SharedPreferences 持久化全量对话记录(saveCacheToLocal)的操作,利用协程移动至 Dispatchers.IO 线程中,防止读写巨大 JSON 字符串时彻底堵死主线程引发应用 ANR 或冻结。 --- .../stand/standapp/ui/chat/ChatViewModel.kt | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt b/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt index 5a0c6e7..043e423 100644 --- a/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt @@ -21,7 +21,7 @@ import org.json.JSONArray import org.json.JSONObject import java.util.UUID -private const val STREAM_FLUSH_INTERVAL_MS = 50L +private const val STREAM_FLUSH_INTERVAL_MS = 150L class ChatViewModel(application: Application) : AndroidViewModel(application) { private val repository = AiChatRepository() @@ -139,34 +139,37 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { } private fun saveCacheToLocal() { - try { - // 保存会话列表 - val sessionsArray = JSONArray() - _sessions.value.forEach { session -> - val obj = JSONObject() - obj.put("id", session.id) - obj.put("title", session.title) - obj.put("timestamp", session.timestamp) - sessionsArray.put(obj) - } + // 将数据保存放到IO线程中,防止SharedPreferences写大文本阻塞主线程卡顿 + viewModelScope.launch(kotlinx.coroutines.Dispatchers.IO) { + try { + // 保存会话列表 + val sessionsArray = JSONArray() + _sessions.value.forEach { session -> + val obj = JSONObject() + obj.put("id", session.id) + obj.put("title", session.title) + obj.put("timestamp", session.timestamp) + sessionsArray.put(obj) + } - // 保存消息列表 - val messagesArray = JSONArray() - _messages.value.forEach { msg -> - val obj = JSONObject() - obj.put("id", msg.id) - obj.put("sessionId", msg.sessionId) - obj.put("role", msg.role.name) - obj.put("content", msg.content) - messagesArray.put(obj) - } + // 保存消息列表 + val messagesArray = JSONArray() + _messages.value.forEach { msg -> + val obj = JSONObject() + obj.put("id", msg.id) + obj.put("sessionId", msg.sessionId) + obj.put("role", msg.role.name) + obj.put("content", msg.content) + messagesArray.put(obj) + } - prefs.edit() - .putString("cache_sessions", sessionsArray.toString()) - .putString("cache_messages", messagesArray.toString()) - .apply() - } catch (e: Exception) { - e.printStackTrace() + prefs.edit() + .putString("cache_sessions", sessionsArray.toString()) + .putString("cache_messages", messagesArray.toString()) + .apply() + } catch (e: Exception) { + e.printStackTrace() + } } }