From 2dc3c16787ead6daf062cad947e9aa4191327607 Mon Sep 17 00:00:00 2001 From: qinglong Date: Sat, 13 Jun 2026 12:50:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E6=94=B9=E7=94=A8=20asyncio=20task=20=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=EF=BC=8C=E6=8A=97=20Android=20=E5=90=8E=E5=8F=B0=E6=8C=82?= =?UTF-8?q?=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SystemMonitor/PluginStatusPanel: 移除 set_interval, 改用外部 refresh() - TuiService._refresh_monitors(): asyncio.sleep(2) 循环刷新 - asyncio.sleep 在 Android 恢复前台后能正常续跑 - shutdown 时 cancel refresh task Co-Authored-By: Claude --- services/tui_service.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/services/tui_service.py b/services/tui_service.py index fd07d78..778a2a8 100644 --- a/services/tui_service.py +++ b/services/tui_service.py @@ -425,10 +425,9 @@ class SystemMonitor(Static): def set_collector(self, c): self._collector = c - def on_mount(self): - self._timer = self.set_interval(2, self._refresh_stats) - - def _refresh_stats(self): + def refresh(self): + """由外部 asyncio task 驱动刷新(比 set_interval 更抗 Android 挂起)""" + self._refresh_stats() try: if not self._collector: self.update("📊 系统监控: 数据源未连接") @@ -477,12 +476,13 @@ class PluginStatusPanel(Static): self._plugin_service = plugin_service self._timer = None - def on_mount(self): - self._timer = self.set_interval(3, self._refresh) - def set_plugin_service(self, svc): self._plugin_service = svc + def refresh(self): + """由外部 asyncio task 驱动刷新""" + self._refresh() + def _refresh(self): try: if not self._plugin_service: @@ -784,7 +784,10 @@ class TuiService: # 启动消息处理任务 self._message_processor_task = asyncio.create_task(self._process_message_queue()) - + + # 启动后台刷新任务 (asyncio.sleep 比 set_interval 更抗 Android 挂起) + self._refresh_task = asyncio.create_task(self._refresh_monitors()) + # 在后台运行TUI asyncio.create_task(self._run_tui()) @@ -850,6 +853,17 @@ class TuiService: except Exception as e: logger.error(f"消息处理任务出错: {str(e)}") + async def _refresh_monitors(self): + """后台刷新系统监控 + 插件面板 (asyncio.sleep, Android 挂起后可恢复)""" + try: + while True: + if self.tui_app: + self.tui_app.system_monitor.refresh() + self.tui_app.plugin_panel.refresh() + await asyncio.sleep(2) + except asyncio.CancelledError: + logger.debug("监控刷新任务被取消") + def _setup_title(self): """设置TUI标题""" try: @@ -886,6 +900,8 @@ class TuiService: def shutdown(self): """关闭TUI服务""" try: + if hasattr(self, '_refresh_task') and self._refresh_task: + self._refresh_task.cancel() if self.tui_app: self.tui_app.shutdown() print("TUI服务已关闭")