# Android Coroutines Expert

> Use to enforce safe concurrency, correct Dispatcher usage, and proper Channel vs StateFlow patterns in ViewModels.

- **Type:** Skill
- **Install:** `agentstack add skill-prasad-vennam-awesome-android-ai-agent-skills-android-coroutines-expert`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [prasad-vennam](https://agentstack.voostack.com/s/prasad-vennam)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [prasad-vennam](https://github.com/prasad-vennam)
- **Source:** https://github.com/prasad-vennam/Awesome-Android-AI-Agent-Skills/tree/main/skills/android-coroutines-expert

## Install

```sh
agentstack add skill-prasad-vennam-awesome-android-ai-agent-skills-android-coroutines-expert
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Coroutines & Concurrency Mastery ⚡🧵

A strict rulebook to prevent thread-blocking, memory leaks, and lost UI events in modern Android applications.

## ⚡ When to Use
- **ViewModel Logic**: Launching coroutines for network/database requests.
- **One-Time UI Events**: Showing Snackbars, Toasts, or Navigation triggers.
- **Parallel Work**: Running multiple non-blocking tasks.

## 🚦 Rule 1: The UI Event Dilemma (StateFlow vs Channel)

You must explicitly distinguish between **UI State** (things that persist on rotation) and **UI Events** (things that happen once, like a Toast or Navigation).

- **UI STATE**: Use `MutableStateFlow`.
- **UI EVENTS**: Use an un-buffered `Channel` exported as a `Flow`. **NEVER** use `SharedFlow` with `replay = 0` or `MutableStateFlow` for one-time events, because if the app rotates, the event might be dropped or replayed twice.

**The Golden Implementation:**
```kotlin
class MyViewModel : ViewModel() {
    // 1. UI STATE
    private val _uiState = MutableStateFlow(MyState())
    val uiState = _uiState.asStateFlow()

    // 2. ONE-TIME EVENTS
    private val _uiEvent = Channel()
    val uiEvent = _uiEvent.receiveAsFlow()

    fun triggerSnackbar() {
        viewModelScope.launch {
             _uiEvent.send(MyAction.ShowSnackbar)
        }
    }
}
```

## 🚥 Rule 2: Dispatcher Discipline
Agents frequently launch heavy database or network calls on the default dispatcher (`Dispatchers.Main` inside a `viewModelScope.launch`).

- **Rule**: If you are using Retrofit or Room, they are naturally "main-safe", so `viewModelScope.launch { }` is fine.
- **Rule**: If you are doing manual file I/O, heavy JSON parsing, or bitmap manipulation, you **MUST** switch to `Dispatchers.IO` using `withContext(Dispatchers.IO) { ... }`.
- **Rule**: If you are doing CPU-heavy sorting or filtering on massive lists, use `Dispatchers.Default`.

## 🛑 Rule 3: Structured Concurrency
If an agent executes multiple independent API requests inside a `viewModelScope.launch`, and one fails, it cancels the entire scope/parent job!

**The Anti-Pattern:**
```kotlin
viewModelScope.launch {
    // If ApiA fails, ApiB is cancelled!
    val resultA = apiA.fetch() 
    val resultB = apiB.fetch()
}
```

**The Architect's Standard (supervisorScope or async):**
```kotlin
viewModelScope.launch {
    // Both attempt to run. If A fails, B continues successfully.
    supervisorScope {
        val deferredA = async { apiA.fetch() }
        val deferredB = async { apiB.fetch() }
        
        try { val a = deferredA.await() } catch (e: Exception) {}
        try { val b = deferredB.await() } catch (e: Exception) {}
    }
}
```

## 🔋 Rule 4: collectAsStateWithLifecycle
As enforced in our Code Review checklists, NEVER use `collectAsState()` in Compose UI. Always use `collectAsStateWithLifecycle()` to ensure Coroutines pause fetching when the screen goes to the background.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [prasad-vennam](https://github.com/prasad-vennam)
- **Source:** [prasad-vennam/Awesome-Android-AI-Agent-Skills](https://github.com/prasad-vennam/Awesome-Android-AI-Agent-Skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-prasad-vennam-awesome-android-ai-agent-skills-android-coroutines-expert
- Seller: https://agentstack.voostack.com/s/prasad-vennam
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
