fix: 系统监控改用 asyncio task 驱动,抗 Android 后台挂起

- SystemMonitor/PluginStatusPanel: 移除 set_interval, 改用外部 refresh()
- TuiService._refresh_monitors(): asyncio.sleep(2) 循环刷新
- asyncio.sleep 在 Android 恢复前台后能正常续跑
- shutdown 时 cancel refresh task

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
qinglong
2026-06-13 12:50:06 +08:00
parent 10d1a1fcb1
commit 2dc3c16787
+23 -7
View File
@@ -425,10 +425,9 @@ class SystemMonitor(Static):
def set_collector(self, c): def set_collector(self, c):
self._collector = c self._collector = c
def on_mount(self): def refresh(self):
self._timer = self.set_interval(2, self._refresh_stats) """由外部 asyncio task 驱动刷新(比 set_interval 更抗 Android 挂起)"""
self._refresh_stats()
def _refresh_stats(self):
try: try:
if not self._collector: if not self._collector:
self.update("📊 系统监控: 数据源未连接") self.update("📊 系统监控: 数据源未连接")
@@ -477,12 +476,13 @@ class PluginStatusPanel(Static):
self._plugin_service = plugin_service self._plugin_service = plugin_service
self._timer = None self._timer = None
def on_mount(self):
self._timer = self.set_interval(3, self._refresh)
def set_plugin_service(self, svc): def set_plugin_service(self, svc):
self._plugin_service = svc self._plugin_service = svc
def refresh(self):
"""由外部 asyncio task 驱动刷新"""
self._refresh()
def _refresh(self): def _refresh(self):
try: try:
if not self._plugin_service: if not self._plugin_service:
@@ -785,6 +785,9 @@ class TuiService:
# 启动消息处理任务 # 启动消息处理任务
self._message_processor_task = asyncio.create_task(self._process_message_queue()) 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 # 在后台运行TUI
asyncio.create_task(self._run_tui()) asyncio.create_task(self._run_tui())
@@ -850,6 +853,17 @@ class TuiService:
except Exception as e: except Exception as e:
logger.error(f"消息处理任务出错: {str(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): def _setup_title(self):
"""设置TUI标题""" """设置TUI标题"""
try: try:
@@ -886,6 +900,8 @@ class TuiService:
def shutdown(self): def shutdown(self):
"""关闭TUI服务""" """关闭TUI服务"""
try: try:
if hasattr(self, '_refresh_task') and self._refresh_task:
self._refresh_task.cancel()
if self.tui_app: if self.tui_app:
self.tui_app.shutdown() self.tui_app.shutdown()
print("TUI服务已关闭") print("TUI服务已关闭")