android-coroutines
プロダクション品質のKotlin CoroutinesをAndroidに適用するための信頼性の高いルールとパターンを提供します。構造化された並行処理、ライフサイクルとの統合、リアクティブストリームを網羅しています。
description の原文を見る
Authoritative rules and patterns for production-quality Kotlin Coroutines onto Android. Covers structured concurrency, lifecycle integration, and reactive streams.
SKILL.md 本文
Android Coroutines エキスパートスキル
このスキルは、Android での本番品質の Kotlin Coroutines コードを記述するための権威的なルールとパターンを提供します。構造化並行性、ライフサイクルセーフティ、および最新のベストプラクティス(2025年標準)を実施します。
責務
- 非同期ロジック: サスペンド関数の実装、Dispatcher 管理、並列実行。
- リアクティブストリーム:
Flow、StateFlow、SharedFlow、callbackFlowの実装。 - ライフサイクル統合: スコープ(
viewModelScope、lifecycleScope)の管理と安全な収集(repeatOnLifecycle)。 - エラーハンドリング:
CoroutineExceptionHandler、SupervisorJob、および適切なtry-catch階層の実装。 - キャンセル可能性:
ensureActive()を使用して長時間実行される操作を協調的にする。 - テスト:
TestDispatcherとrunTestのセットアップ。
適用可能性
ユーザーが以下を尋ねるときにこのスキルを有効にします:
- 「API/データベースからデータをフェッチする」
- 「バックグラウンド処理を実行する」
- 「メモリリークを修正する」(スレッド/タスク関連)
- 「リスナー/コールバックを Coroutines に変換する」
- 「ViewModel を実装する」
- 「UI 状態更新を処理する」
重要なルール & 制約
1. Dispatcher インジェクション(テスト可能性)
- 決して クラス内で Dispatcher をハードコードしない(例:
Dispatchers.IO、Dispatchers.Default)。 - 常に コンストラクタ経由で
CoroutineDispatcherをインジェクトする。 - 便宜上、コンストラクタ引数で
Dispatchers.IOをデフォルトにするが、上書き可能にする。
// 正しい
class UserRepository(
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) { ... }
// 間違い
class UserRepository {
fun getData() = withContext(Dispatchers.IO) { ... }
}
2. メインセーフティ
- Data または Domain レイヤーで定義されたすべてのサスペンド関数は メインセーフ である必要があります。
- ワンショット呼び出し は
suspend関数として公開すること。 - データ変更 は
Flowとして公開すること。 - 呼び出し元(ViewModel)は
Dispatchers.Mainから UI をブロックせずに呼び出せる必要があります。 - リポジトリ実装内で
withContext(dispatcher)を使用して、実行をバックグラウンドに移動します。
3. ライフサイクル対応の収集
- 決して
lifecycleScope.launchまたはlaunchWhenStarted(非推奨/危険)で flow を直接収集しない。 - 常に Activity または Fragment で flow を収集するために
repeatOnLifecycle(Lifecycle.State.STARTED)を使用すること。
// 正しい
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { ... }
}
}
4. ViewModel スコープ使用法
- ViewModel でコルーチンを開始するには
viewModelScopeを使用する。 - ViewModel から View に対してサスペンド関数を公開しない。ViewModel は View が監視する
StateFlowまたはSharedFlowを公開する必要があります。
5. 可変状態のカプセル化
- 決して
MutableStateFlowまたはMutableSharedFlowを公開しない。 .asStateFlow()またはアップキャストを使用して、読み取り専用StateFlowまたはFlowとして公開する。
6. GlobalScope 禁止
- 決して
GlobalScopeを使用しない。構造化並行性を破壊し、リークにつながる。 - タスクが現在のスコープを超えて存在する必要がある場合は、インジェクトされた
applicationScope(Application ライフサイクルに結び付いたカスタムスコープ)を使用する。
7. エラーハンドリング
- 決して 汎用の
catch (e: Exception)ブロックでCancellationExceptionをキャッチしない(再スローなし)。 runCatchingは、明示的にCancellationExceptionを再スローする場合のみ使用する。CoroutineExceptionHandlerは、トップレベルコルーチン(launch内)でのみ使用する。asyncまたは子コルーチン内では効果がありません。
8. キャンセル可能性
- コルーチンは 協調的キャンセル を特徴とします。キャンセルをチェックしない限り、すぐには停止しません。
- タイトなループ(例:大量リストの処理、ファイル読み取り)でキャンセルをチェックするために、
ensureActive()またはyield()を呼び出すこと。 delay()やwithContext()などの標準関数は既にキャンセル可能です。
9. コールバック変換
callbackFlowを使用して、コールバックベースの API を Flow に変換する。- 常に
callbackFlowブロックの終わりでawaitCloseを使用して、リスナーを登録解除する。
コードパターン
Flow を使用したリポジトリパターン
class NewsRepository(
private val remoteDataSource: NewsRemoteDataSource,
private val externalScope: CoroutineScope, // アプリ全体イベント用
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
val newsUpdates: Flow<List<News>> = flow {
val news = remoteDataSource.fetchLatestNews()
emit(news)
}.flowOn(ioDispatcher) // アップストリームは IO で実行
}
並列実行
suspend fun loadDashboardData() = coroutineScope {
val userDeferred = async { userRepo.getUser() }
val feedDeferred = async { feedRepo.getFeed() }
// 両方を待つ
DashboardData(
user = userDeferred.await(),
feed = feedDeferred.await()
)
}
runTest を使用したテスト
@Test
fun testViewModel() = runTest {
val testDispatcher = StandardTestDispatcher(testScheduler)
val viewModel = MyViewModel(testDispatcher)
viewModel.loadData()
advanceUntilIdle() // コルーチンを処理
assertEquals(expectedState, 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を通じてオンチェーン取引とデータ照会を実現します。