kotlin-concurrency-expert
Kotlin Coroutinesのレビューおよび修正をAndroid向けに行います。並行処理の使い方のレビュー、Coroutine関連のバグ修正、スレッドセーフの改善、またはKotlin/AndroidコードのライフサイクルにまつわるIssueの解決を求められた際に使用してください。
description の原文を見る
Kotlin Coroutines review and remediation for Android. Use when asked to review concurrency usage, fix coroutine-related bugs, improve thread safety, or resolve lifecycle issues in Kotlin/Android code.
SKILL.md 本文
Kotlin Concurrency Expert
Overview
Android コードベースの Kotlin Coroutines の問題をレビューおよび修正します。構造化並行処理、ライフサイクル安全性、適切なスコープ指定、および最小限の動作変更で最新のベストプラクティスを適用します。
Workflow
1. 問題の分類
- 正確なエラー、クラッシュ、または症状 (ANR、メモリリーク、競合状態、不正な状態) をキャプチャします。
- プロジェクトの coroutines セットアップを確認:
kotlinx-coroutines-androidバージョン、lifecycle-runtime-ktxバージョン。 - 現在のスコープコンテキストを識別します (
viewModelScope、lifecycleScope、カスタムスコープ、またはなし)。 - コードが UI にバインドされている (
Dispatchers.Main) か、メインスレッド以外で実行される想定 (Dispatchers.IO、Dispatchers.Default) かを確認します。 - テスト可能性のための Dispatcher 注入パターンを検証します。
2. 最小限の安全な修正を適用
既存の動作を保持しながら、構造化並行処理とライフサイクル安全性を満たす編集を優先します。
一般的な修正:
- ANR / メインスレッドのブロッキング: 重い処理を
withContext(Dispatchers.IO)またはDispatchers.Defaultに移動; suspend 関数がメインセーフであることを確認します。 - メモリリーク / ゾンビ coroutines:
GlobalScopeをライフサイクルにバインドされたスコープ (viewModelScope、lifecycleScope、または注入されたapplicationScope) に置き換えます。 - ライフサイクルコレクションの問題: 非推奨の
launchWhenStartedをrepeatOnLifecycle(Lifecycle.State.STARTED)に置き換えます。 - 状態の露出:
MutableStateFlow/MutableSharedFlowをカプセル化; 読み取り専用のStateFlowまたはFlowを露出します。 - CancellationException の飲み込み: 汎用
catch (e: Exception)ブロックがCancellationExceptionを再スロー することを確認します。 - 非協調的なキャンセレーション: ループ内で
ensureActive()またはyield()を追加して協調的キャンセレーションを実現します。 - コールバック API: リスナーを
callbackFlowで変換し、適切なawaitCloseクリーンアップを行います。 - ハードコードされた Dispatchers: テスト可能性のために
CoroutineDispatcherをコンストラクタ経由で注入します。
Critical Rules
Dispatcher 注入 (テスト可能性)
// CORRECT: Dispatcher を注入
class UserRepository(
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
suspend fun fetchUser() = withContext(ioDispatcher) { ... }
}
// INCORRECT: ハードコードされた Dispatcher
class UserRepository {
suspend fun fetchUser() = withContext(Dispatchers.IO) { ... }
}
ライフサイクル対応コレクション
// CORRECT: repeatOnLifecycle を使用
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state -> updateUI(state) }
}
}
// INCORRECT: 直接コレクション (危険、非推奨)
lifecycleScope.launchWhenStarted {
viewModel.uiState.collect { state -> updateUI(state) }
}
状態のカプセル化
// CORRECT: 読み取り専用 StateFlow を露出
class MyViewModel : ViewModel() {
private val _uiState = MutableStateFlow(UiState())
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
}
// INCORRECT: ミュータブル状態が露出
class MyViewModel : ViewModel() {
val uiState = MutableStateFlow(UiState()) // ミュータビリティが漏洩
}
例外処理
// CORRECT: CancellationException を再スロー
try {
doSuspendWork()
} catch (e: CancellationException) {
throw e // 必ず再スロー!
} catch (e: Exception) {
handleError(e)
}
// INCORRECT: キャンセレーションを飲み込み
try {
doSuspendWork()
} catch (e: Exception) {
handleError(e) // CancellationException が飲み込まれる!
}
協調的キャンセレーション
// CORRECT: ループ内でキャンセレーションをチェック
suspend fun processLargeList(items: List<Item>) {
items.forEach { item ->
ensureActive() // キャンセレーションをチェック
processItem(item)
}
}
// INCORRECT: 非協調的 (キャンセレーションを無視)
suspend fun processLargeList(items: List<Item>) {
items.forEach { item ->
processItem(item) // キャンセレーションをチェックしない
}
}
コールバック変換
// CORRECT: callbackFlow と awaitClose
fun locationUpdates(): Flow<Location> = callbackFlow {
val listener = LocationListener { location ->
trySend(location)
}
locationManager.requestLocationUpdates(listener)
awaitClose { locationManager.removeUpdates(listener) }
}
スコープガイドライン
| スコープ | 使用場面 | ライフサイクル |
|---|---|---|
viewModelScope | ViewModel 操作 | ViewModel とともにクリア |
lifecycleScope | Activity/Fragment での UI 操作 | ライフサイクル所有者とともに破棄 |
repeatOnLifecycle | UI での Flow コレクション | ライフサイクル状態の開始/停止に応じて |
applicationScope (注入) | アプリ全体のバックグラウンド処理 | アプリケーション存続期間 |
GlobalScope | 決して使用しない | 構造化並行処理を破壊 |
テストパターン
@Test
fun `loading data updates state`() = runTest {
val testDispatcher = StandardTestDispatcher(testScheduler)
val repository = FakeRepository()
val viewModel = MyViewModel(repository, testDispatcher)
viewModel.loadData()
advanceUntilIdle()
assertEquals(UiState.Success(data), viewModel.uiState.value)
}
参考資料
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- new-silvermoon
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/new-silvermoon/awesome-android-agent-skills / ライセンス: Apache-2.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。