Bird
Raised Fist0
Android Kotlinmobile~20 mins

CoroutineScope and dispatchers in Android Kotlin - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
CoroutineScope Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Understanding CoroutineScope context
What is the default dispatcher used by CoroutineScope when none is specified?
ADispatchers.Unconfined
BDispatchers.Default
CDispatchers.Main
DDispatchers.IO
Attempts:
2 left
💡 Hint
Think about the dispatcher optimized for CPU-intensive work.
❓ ui_behavior
intermediate
2:00remaining
Choosing dispatcher for network calls
Which dispatcher should you use to perform network requests without blocking the main thread?
ADispatchers.IO
BDispatchers.Main
CDispatchers.Default
DDispatchers.Unconfined
Attempts:
2 left
💡 Hint
This dispatcher is optimized for blocking IO tasks like file or network operations.
❓ lifecycle
advanced
2:00remaining
CoroutineScope and Android lifecycle
What happens if you launch a coroutine in a CoroutineScope tied to an Activity and the Activity is destroyed before the coroutine completes?
AThe coroutine continues running in the background.
BThe coroutine throws an exception immediately.
CThe coroutine is automatically cancelled.
DThe coroutine switches to Dispatchers.Main automatically.
Attempts:
2 left
💡 Hint
Think about how lifecycle-aware scopes behave to prevent memory leaks.
📝 Syntax
advanced
2:00remaining
Correct dispatcher usage in coroutine launch
Which of the following code snippets correctly launches a coroutine on the IO dispatcher?
Android Kotlin
fun fetchData() {
  CoroutineScope(Dispatchers.IO).launch {
    // network call
  }
}
ACoroutineScope(Dispatchers.IO).launch { /* network call */ }
BCoroutineScope.launch(Dispatchers.IO) { /* network call */ }
CCoroutineScope(Dispatchers.Main).launch(Dispatchers.IO) { /* network call */ }
Dlaunch(Dispatchers.IO) { /* network call */ }
Attempts:
2 left
💡 Hint
Remember how to pass dispatcher to CoroutineScope constructor.
🔧 Debug
expert
2:00remaining
Diagnosing coroutine dispatcher misuse
Given this code snippet, what error or behavior will occur? fun loadData() { CoroutineScope(Dispatchers.Main).launch { Thread.sleep(3000) println("Data loaded") } }
AThe code causes a compile-time error due to Thread.sleep usage.
BThe coroutine throws a CancellationException immediately.
CThe coroutine runs asynchronously without blocking the UI.
DThe UI freezes for 3 seconds because Thread.sleep blocks the main thread.
Attempts:
2 left
💡 Hint
Consider what Thread.sleep does on the main thread.

Practice

(1/5)
1. What is the main role of CoroutineScope in Kotlin coroutines?
easy
A. It pauses the coroutine execution.
B. It decides which thread the coroutine runs on.
C. It controls the lifecycle and context where coroutines run.
D. It cancels all running threads in the app.

Solution

  1. Step 1: Understand CoroutineScope purpose

    CoroutineScope defines the lifecycle and context for coroutines, managing their start and cancellation.
  2. Step 2: Differentiate from Dispatchers

    Dispatchers decide the thread, but CoroutineScope manages the coroutine's lifecycle and context.
  3. Final Answer:

    It controls the lifecycle and context where coroutines run. -> Option C
  4. Quick Check:

    CoroutineScope = lifecycle control [OK]
Hint: CoroutineScope manages lifecycle, not threads [OK]
Common Mistakes:
  • Confusing CoroutineScope with Dispatchers
  • Thinking CoroutineScope controls threads
  • Assuming CoroutineScope pauses coroutines
2. Which of the following is the correct way to launch a coroutine on the main thread using CoroutineScope and Dispatchers?
easy
A. CoroutineScope(Dispatchers.IO).launch { /* code */ }
B. CoroutineScope(Dispatchers.Main).launch { /* code */ }
C. CoroutineScope(Dispatchers.Default).launch { /* code */ }
D. CoroutineScope(Dispatchers.Unconfined).launch { /* code */ }

Solution

  1. Step 1: Identify dispatcher for main thread

    Dispatchers.Main is used to run coroutines on the main (UI) thread.
  2. Step 2: Match with CoroutineScope usage

    Using CoroutineScope(Dispatchers.Main).launch { ... } correctly launches coroutine on main thread.
  3. Final Answer:

    CoroutineScope(Dispatchers.Main).launch { /* code */ } -> Option B
  4. Quick Check:

    Main thread = Dispatchers.Main [OK]
Hint: Main thread uses Dispatchers.Main [OK]
Common Mistakes:
  • Using Dispatchers.IO for UI updates
  • Confusing Default with Main dispatcher
  • Using Unconfined without understanding
3. What will be the output of this Kotlin code snippet?
fun main() = runBlocking {
  launch(Dispatchers.Default) {
    println("Running on thread: ${Thread.currentThread().name}")
  }
}
medium
A. Running on thread: DefaultDispatcher-worker-1
B. Running on thread: Unconfined
C. Running on thread: IO-thread-1
D. Running on thread: main

Solution

  1. Step 1: Understand Dispatchers.Default behavior

    Dispatchers.Default runs coroutines on a shared background thread pool, named like DefaultDispatcher-worker-1.
  2. Step 2: Analyze thread name printed

    The println shows the thread name, which will be a DefaultDispatcher worker thread, not main or IO.
  3. Final Answer:

    Running on thread: DefaultDispatcher-worker-1 -> Option A
  4. Quick Check:

    Dispatchers.Default = DefaultDispatcher-worker thread [OK]
Hint: Default dispatcher uses DefaultDispatcher-worker threads [OK]
Common Mistakes:
  • Assuming main thread runs Default dispatcher
  • Confusing IO dispatcher with Default
  • Expecting Unconfined thread name
4. Identify the error in this Kotlin coroutine code:
CoroutineScope(Dispatchers.Main).launch {
  val result = withContext(Dispatchers.IO) {
    fetchData()
  }
  updateUI(result)
}

fun fetchData(): String {
  Thread.sleep(1000)
  return "Data"
}

fun updateUI(data: String) {
  println(data)
}
medium
A. updateUI() cannot be called inside coroutine.
B. withContext cannot switch dispatchers inside launch.
C. CoroutineScope cannot be created with Dispatchers.Main.
D. Using Thread.sleep() blocks the IO dispatcher thread.

Solution

  1. Step 1: Check blocking calls inside coroutine

    Thread.sleep() blocks the thread, which is bad even on IO dispatcher as it wastes thread resources.
  2. Step 2: Understand coroutine-friendly alternatives

    Instead of Thread.sleep(), use delay() which suspends without blocking the thread.
  3. Final Answer:

    Using Thread.sleep() blocks the IO dispatcher thread. -> Option D
  4. Quick Check:

    Blocking calls like Thread.sleep() cause issues [OK]
Hint: Avoid Thread.sleep() in coroutines; use delay() [OK]
Common Mistakes:
  • Thinking withContext can't switch dispatchers
  • Believing CoroutineScope can't use Dispatchers.Main
  • Assuming updateUI() can't run in coroutine
5. You want to perform a long-running network request without blocking the UI, then update the UI with the result. Which coroutine setup is best practice?
hard
A. Launch coroutine in Dispatchers.Main, then use withContext(Dispatchers.IO) for network call, update UI after.
B. Launch coroutine in Dispatchers.IO, then update UI directly inside it.
C. Launch coroutine in Dispatchers.Default, then use Thread.sleep() for delay, update UI after.
D. Launch coroutine in Dispatchers.Unconfined, then update UI after network call.

Solution

  1. Step 1: Identify correct dispatcher for network call

    Network calls should run on Dispatchers.IO to avoid blocking the main thread.
  2. Step 2: Update UI on main thread

    UI updates must happen on Dispatchers.Main to avoid errors and keep UI responsive.
  3. Step 3: Combine withContext and launch properly

    Launch on Main, switch to IO for network call with withContext, then back to Main for UI update.
  4. Final Answer:

    Launch coroutine in Dispatchers.Main, then use withContext(Dispatchers.IO) for network call, update UI after. -> Option A
  5. Quick Check:

    Network on IO, UI on Main [OK]
Hint: Use withContext(IO) inside Main coroutine for network [OK]
Common Mistakes:
  • Updating UI from IO dispatcher
  • Blocking threads with Thread.sleep()
  • Using Unconfined dispatcher for UI updates
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard