Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Using_Kotlin_Coroutines.pdf

Avatar for heri heri
November 16, 2019

 Using_Kotlin_Coroutines.pdf

Avatar for heri

heri

November 16, 2019

Other Decks in Programming

Transcript

  1. Android solutions • AsyncTask • Loaders (deprecated in Android P)

    • RxJava • Thread / HandlerThread / Executor with callbacks
  2. fun login(name, pass) { requestLogin(name, pass) { result -> show(result)

    } } onDraw onDraw onDraw requestLogin UI Thread
  3. fun login(name, pass) { requestLogin(name, pass) { result -> show(result)

    } } onDraw onDraw onDraw requestLogin UI Thread onDraw process is blocked
  4. fun login(name, pass) { requestLogin(name, pass) { result -> show(result)

    } } onDraw onDraw onDraw requestLogin UI Thread show onDraw onDraw process is blocked
  5. fun login(name, pass) { requestLogin(name, pass) { result -> show(result)

    } } onDraw onDraw onDraw requestLogin UI Thread show onDraw onDraw onDraw onDraw
  6. Threads and callbacks fun login(name, pass) { val thread =

    Thread(Runnable() -> { requestLogin(name, pass) { result -> show(result) //non-ui thread? } } thread.start() }
  7. Threads and callbacks fun login(name, pass) { val thread =

    Thread(Runnable() -> { requestLogin(name, pass) { result -> Handler(Looper.getMainLooper()) { show(result) //back to Main } } } thread.start() }
  8. Coroutine • Write asynchronous code sequentially • ~lightweight thread fun

    login(name, pass) = launch { val result = requestLogin(name, pass) show(result) }
  9. Coroutine • Not bound to specific Thread • Complete with

    a result fun login(name, pass) = launch(Dispatchers.IO){ val result = requestLogin(name, pass) withContext(Dispatchers.Main) { show(result) } }
  10. Coroutine Suspend function suspend fun requestLogin( name: String, pass: String

    ): Result = withContext(Dispatchers.IO) { ... } Suspending functions do not block the caller thread.
  11. Dispatchers.Default • Common pool of shared background threads • Use

    it for: computing-intensive coroutines Dispatchers.Unconfined • Doesn’t confine the coroutine to any specific thread • Don’t use it in code Dispatchers.IO • Shared pool of on-demand created threads • Use it for: IO-intensive blocking operations Dispatchers.Main • Main thread • Use it for: UI operations
  12. Coroutine Suspend function Suspension functions can only be called from

    other suspension functions or from coroutines suspend fun login(name, pass) { val result = requestLogin(name, pass) //suspend show(result) }
  13. Sequencial & Data Dependencies suspend fun login(name, pass) { val

    authToken = authenticate() //suspend val result = requestLogin(authToken, name, pass) //suspend show(result) }
  14. Errors suspend fun login(name, pass) { try { val result

    = requestLogin(name, pass) show(result) } catch (error: NetworkError){ //Handle error } }
  15. Login button pressed Launch coroutine requestLogin Show login status val

    job = Job() val uiScope = CoroutineScope(Dispatchers.Main + job)
  16. Login button pressed Launch coroutine requestLogin Show login status val

    job = Job() val uiScope = CoroutineScope(Dispatchers.Main + job) fun login(username: String, pass: String ) = uiScope.launch { val result = requestLogin(name, pass) show(result) }
  17. Login button pressed Launch coroutine requestLogin Show login status val

    job = Job() val uiScope = CoroutineScope(Dispatchers.Main + job) fun login(username: String, pass: String ) = uiScope.launch(Dispatchers.IO) { val result = requestLogin(name, pass) show(result) }
  18. val job = Job() val uiScope = CoroutineScope(Dispatchers.Main + job)

    fun login( username: String, pass: String ) = uiScope.launch { val result = requestLogin(name, pass) show(result) } job.cancel()
  19. Login button pressed Launch coroutine requestLogin Show login status ViewModel

    fun onCleared() { super.onCleared() job.cancel() }
  20. class MyViewModel: ViewModel() { val viewModelJob = Job() val uiScope

    = CoroutineScope(Dispatchers.Main+viewModelJob) fun login( username: String, pass: String ) = uiScope.launch(Dispatchers.IO) { val result = requestLogin(name, pass) show(result) } fun onCleared() { super.onCleared() viewModelJob.cancel() } }
  21. lifecycle-viewmodel-ktx class MyViewModel: ViewModel() { fun login( username: String, pass:

    String ) = viewModelScope.launch(Dispatchers.IO) { val result = requestLogin(name, pass) show(result) } }
  22. • Coroutines • suspend functions • Dispatchers • Launching a

    coroutine • Using a coroutine from ViewModels