chore: 批量完成2026-05-24版本迭代更新
本次提交涵盖多项功能优化与重构: 1. 重构pro_image_editor依赖为官方托管版本,移除本地包引用 2. 拆分角色表情枚举至独立文件,优化代码复用性 3. 新增壁纸收藏、预加载、健康检测服务与本地存储支持 4. 完善API响应类型安全检查与排行榜服务能力 5. 新增应用锁设置路由与页面支持 6. 优化路由跳转使用常量路径替代硬编码字符串 7. 新增阅读报告分享功能与设置变更日志服务 8. 修复多处类型转换与空指针风险问题 9. 调整API超时时间优化网络请求表现 10. 统一文件头格式与部分UI组件样式
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
// ============================================================
|
||||
// 闲言APP — 特效互斥调度器
|
||||
// 创建时间: 2026-05-22
|
||||
// 更新时间: 2026-05-22
|
||||
// 更新时间: 2026-05-24
|
||||
// 作用: 限制同一时刻运行的重量级特效数量,防止GPU过载
|
||||
// 上次更新: 初始创建
|
||||
// 上次更新: 添加acquire()超时机制,防止永久阻塞
|
||||
// ============================================================
|
||||
|
||||
import 'dart:async';
|
||||
@@ -51,9 +51,11 @@ class EffectMutex {
|
||||
///
|
||||
/// 如果当前活跃特效数未达上限,立即返回 token;
|
||||
/// 否则等待直到有槽位释放。
|
||||
/// [timeout] 不为 null 时,超时后从等待队列移除并抛出 TimeoutException。
|
||||
Future<EffectToken> acquire(
|
||||
String name, {
|
||||
EffectPriority priority = EffectPriority.decoration,
|
||||
Duration? timeout,
|
||||
}) async {
|
||||
if (_active.length < maxConcurrent) {
|
||||
final token = EffectToken._(this, name);
|
||||
@@ -65,10 +67,26 @@ class EffectMutex {
|
||||
}
|
||||
|
||||
final completer = Completer<EffectToken>();
|
||||
_pending.add(_PendingEffect(name, priority, completer));
|
||||
final pending = _PendingEffect(name, priority, completer);
|
||||
_pending.add(pending);
|
||||
Log.i(
|
||||
'EffectMutex: "$name" 排队等待 (优先级=${priority.name}, 队列=${_pending.length})',
|
||||
);
|
||||
|
||||
if (timeout != null) {
|
||||
pending._timer = Timer(timeout, () {
|
||||
if (!completer.isCompleted) {
|
||||
_pending.remove(pending);
|
||||
completer.completeError(
|
||||
TimeoutException(
|
||||
'EffectMutex: "$name" 等待超时 (${timeout.inMilliseconds}ms)',
|
||||
),
|
||||
);
|
||||
Log.i('EffectMutex: "$name" 等待超时');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return completer.future;
|
||||
}
|
||||
|
||||
@@ -81,6 +99,7 @@ class EffectMutex {
|
||||
if (_pending.isNotEmpty) {
|
||||
_pending.sort((a, b) => a.priority.value.compareTo(b.priority.value));
|
||||
final next = _pending.removeAt(0);
|
||||
next._timer?.cancel();
|
||||
final newToken = EffectToken._(this, next.name);
|
||||
_active.add(newToken);
|
||||
next.completer.complete(newToken);
|
||||
@@ -96,4 +115,5 @@ class _PendingEffect {
|
||||
final String name;
|
||||
final EffectPriority priority;
|
||||
final Completer<EffectToken> completer;
|
||||
Timer? _timer;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user