Summary
Kuikly 协程与多线程编程助手。指导如何在 Kuikly 中进行异步编程,包括 Kuikly 内建协程、kotlinx 协程、kuiklyx 协程库。当用户在 Kuikly 中需要执行异步任务、切换线程、使用协程、回到 Kuikly 线程更新 UI、排查线程安全问题时使用。
tencent-tds/kuiklyui-ai
Kuikly 协程与多线程编程助手。指导如何在 Kuikly 中进行异步编程,?
npx skills add tencent-tds/kuiklyui-ai --skill kuikly-coroutines-threading
Kuikly 协程与多线程编程助手。指导如何在 Kuikly 中进行异步编程,包括 Kuikly 内建协程、kotlinx 协程、kuiklyx 协程库。当用户在 Kuikly 中需要执行异步任务、切换线程、使用协程、回到 Kuikly 线程更新 UI、排查线程安全问题时使用。
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existi…
866.4K installsBrowser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
810.4K installsReview UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "chec…
617.3K installsBuild, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and …
576.5K installsDebug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe …
568.9K installsOther skills from tencent-tds/kuiklyui-ai · top by installs.
npx skills add tencent-tds/kuiklyui-ai
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Files included with this skill beyond the listing page.
SKILL.md
6,717 B
SUMMARY.md
336 B
| 特性 | 回调(无协程) | Kuikly 内建协程 | kotlinx 协程 |
|---|---|---|---|
| 动态化支持 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 依赖库包增量 | 无 | 无 | kotlinx 协程库 |
| 线程安全 | 不涉及 | 自动保障 | 需要考虑 |
框架自带,始终在 Kuikly 线程执行,无线程切换开销,支持动态化。
API 入口:
GlobalScope.launch { ... } — 全局作用域lifecycleScope.launch { ... } — 绑定 Pager 生命周期(推荐)async { ... } / await() — 并发获取结果import:
import com.tencent.kuikly.core.coroutines.GlobalScope
import com.tencent.kuikly.core.coroutines.launch
import com.tencent.kuikly.core.coroutines.async
import com.tencent.kuikly.core.coroutines.delay
注意: Kuikly 内建协程 API 本身非线程安全,不能在 Kuikly 线程外调用。
Kotlin 官方协程库,支持多线程调度器(Dispatchers.Default/IO/Main 等),不支持动态化。
接入方式:
// iOS & Android
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$KOTLINX_COROUTINES_VERSION")
// 鸿蒙
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$KOTLINX_COROUTINES_OHOS_VERSION")
提供 Dispatchers.Kuikly 调度器和 KuiklyContextScheduler 回调 API,用于从非 Kuikly 线程切回 Kuikly 线程。
接入方式:
// iOS & Android
implementation("com.tencent.kuiklyx:coroutines:$KUIKLYX_COROUTINES_VERSION")
// 鸿蒙
implementation("com.tencent.kuiklyx:coroutines:$KUIKLYX_COROUTINES_OHOS_VERSION")
协程方式 API:
// 启动协程,在 Kuikly 线程执行
GlobalScope.launch(Dispatchers.Kuikly[ctx]) { ... }
// 在协程中切换到 Kuikly 线程
withContext(Dispatchers.Kuikly[ctx]) { ... }
回调方式 API:
KuiklyContextScheduler.runOnKuiklyThread(pagerId) { cancel ->
if (cancel) return // pager 已销毁
// 在 Kuikly 线程执行
}
根据需求选择合适的异步编程方式:
需要异步编程?
├── 只需简化回调,无多线程诉求?
│ └── → 方式1:Kuikly 内建协程
├── 需要执行耗时任务 + 支持动态化?
│ └── → 方式2:Module 机制(可配合内建协程)
├── 需要多线程 + 不需要动态化?
│ └── → 方式3:kotlinx 协程 + kuiklyx 协程
└── Compose DSL 页面?
└── → 方式4:LaunchedEffect + withContext
⚠️ 一致性原则:选择方案时,还需关注当前项目或模块中已有的异步编程方式,应优先保持一致,避免在同一模块中混用多套异步方案。
详细场景示例和代码:见 [SCENARIOS.md](references/SCENARIOS.md)
Compose DSL 页面(继承 ComposeContainer)使用 kotlinx 协程体系:
@Composable
fun MyContent() {
var data by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
// 默认在 Kuikly 线程执行(ComposeDispatcher)
val result = withContext(Dispatchers.IO) {
// 在 IO 线程执行耗时任务
fetchData()
}
// 自动回到 Kuikly 线程
data = result
}
Text(text = data)
}
关键点:
LaunchedEffect 默认运行在 Kuikly 线程(通过 ComposeDispatcher 调度)withContext(Dispatchers.IO) 切换到 IO 线程执行耗时任务withContext 返回后自动回到 Kuikly 线程viewModelScope 也绑定到 Kuikly 线程,ViewModel 销毁时自动取消Dispatchers.IO 跨平台定义:
// commonMain 中声明 expect
internal expect val Dispatchers.IO: CoroutineDispatcher
// androidMain / appleMain / ohosArm64Main
internal actual val Dispatchers.IO: CoroutineDispatcher
get() = Dispatchers.IO // 使用平台原生 IO 调度器
// jsMain(不支持多线程)
internal actual val Dispatchers.IO: CoroutineDispatcher
get() = Dispatchers.Default
详细用法和示例:见 [THREADSAFETY.md](references/THREADSAFETY.md)
override fun willInit() {
super.willInit()
Pager.VERIFY_THREAD = true // 开启线程校验
Pager.VERIFY_REACTIVE_OBSERVER = true // 开启 observable 校验
Pager.verifyFailed { exception -> // 自定义验证失败处理
println("线程安全验证失败: ${exception.message}")
throw exception
}
}
| ❌ 错误做法 | ✅ 正确做法 |
|---|---|
| 在非 Kuikly 线程直接更新 observable | 通过 Dispatchers.Kuikly 或 KuiklyContextScheduler 切回 Kuikly 线程 |
| 在非 Kuikly 线程调用 Module 方法 | Module 的 acquireModule / toNative 等方法需在 Kuikly 线程调用 |
| 在动态化场景使用 kotlinx 协程 | 使用 Kuikly 内建协程或 Module 机制 |
| 在 Kuikly 线程外调用内建协程 API | 内建协程 API 只能在 Kuikly 线程调用 |
| 忘记处理 Pager 销毁后的回调 | KuiklyContextScheduler 回调检查 cancel 参数 |
在 verifyFailed 回调中操作 UI |
验证失败通常发生在非 Kuikly 线程,不能调用 UI API |
| Compose 中在 IO 线程更新 State | 使用 withContext 回到默认调度器后再更新 State |