CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
I O CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
I O 0 sm.item = "Friends" sm.label = 1 CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
I O 0 sm.item = "Friends" sm.label = 1 showsApi.getShowsByName(“Friends”, cont) Continuation CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
I O 0 1 show = sm.result sm.label = 2 sm.item = "Friends" sm.label = 1 showsApi.getShowsByName(“Friends”, cont) CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
I O 0 1 show = sm.result sm.label = 2 showsApi.getCharacters(show.id, cont) sm.item = "Friends" sm.label = 1 showsApi.getShowsByName(“Friends”, cont) Continuation CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
I O 0 1 show = sm.result sm.label = 2 showsApi.getCharacters(show.id, cont) sm.item = "Friends" sm.label = 1 showsApi.getShowsByName(“Friends”, cont) Continuation 2 characters = sm.result CoroutineScope.launch(Dispatchers.IO){ val show = showsApi.getShowByName("Friends") val characters = showsApi.getCharacters(show.id) withContext(Dispatchers.Main){ // do something with characters on UI } }
No Change HTTP over Retrofit.Builder() .baseUrl(MoviesApiInterface.MOVIES_ENDPOINT) .addConverterFactory(gsonConverterFactory) .client(okHttp) .build() .create(MoviesApiInterface::class.java)
Error Handling • Wrap your response in Result class sealed class Result { data class Success(val data: T) : Result() data class Error(val exception: Exception) : Result() } • Gotta catch them all onError onErrorReturn onErrorResumeNext doOnError onErrorComplete onErrorReturnItem
suspend fun apiCall(call: suspend () -> Result, errorMessage: String): Result { return try { call() } catch (e: Exception) { Result.Error(e) } } Result Let’s be a pro
suspend fun getLatestMovies(): Result { return apiCall( { val data = moviesApiInterface.getInTheatreMovies() return@apiCall Result.Success(data.body()) }, "Couldn't get" ) } So, Now are we pro? Let’s be a pro
No Let’s be a pro So, Now are we pro? suspend fun getLatestMovies(): Result { return apiCall( { val data = moviesApiInterface.getInTheatreMovies() return@apiCall Result.Success(data.body()) }, "Couldn't get" ) }
Zip Calls in Observable.zip(getPopularMovies(), getNowPlayingMovies(), BiFunction { popularMovies, topRatedMovies, -> // Filter from popular and top rated movies }.subscribeOn(Scheduler.io())
Zip Calls in Let’s apply TEST rule Observable.zip(getPopularMovies(), getNowPlayingMovies(), BiFunction { popularMovies, topRatedMovies, -> // Filter from popular and top rated movies }.subscribeOn(Scheduler.io())
Zip Calls in Threading Exception Handling Scalability Transforming results Observable.zip(getPopularMovies(), getNowPlayingMovies(), BiFunction { popularMovies, topRatedMovies, -> // Filter from popular and top rated movies }.subscribeOn(Scheduler.io())
Zip Calls in Threading Exception Handling Scalability Transforming results Observable.zip(getPopularMovies(), getNowPlayingMovies(), BiFunction { popularMovies, topRatedMovies, -> // Filter from popular and top rated movies }.subscribeOn(Scheduler.io())
Zip Calls in Threading Exception Handling Scalability Transforming results Observable.zip(getPopularMovies(), getNowPlayingMovies(), BiFunction { popularMovies, topRatedMovies, -> // Filter from popular and top rated movies }.subscribeOn(Scheduler.io())
Zip Calls in Threading Exception Handling Scalability Transforming results Observable.zip(getPopularMovies(), getNowPlayingMovies(), BiFunction { popularMovies, topRatedMovies, -> // Filter from popular and top rated movies }.subscribeOn(Scheduler.io())
suspend fun zip(source1: Deferred, source2: Deferred, zipper: (T1, T2) -> R) = coroutineScope { // wait for two calls to complete async { zipper(source1.await(), source2.await()) } } Zip Calls in • Let’s cook zip +
suspend fun zip(source1: Deferred, source2: Deferred, zipper: (T1, T2) -> R) = coroutineScope { // wait for two calls to complete async { zipper(source1.await(), source2.await()) } } Zip Calls in • Let’s cook zip + Zip Deferred 1 Deferred 2 Zipper Result
suspend fun zip(source1: Deferred, source2: Deferred, zipper: (T1, T2) -> R) = coroutineScope { // wait for two calls to complete async { zipper(source1.await(), source2.await()) } } Zip Calls in • Let’s cook zip +
Zip Calls in coroutineScope.launch { val popularMovies = async{ getPopularMovies() } val topRatedMovies = async{ getTopRatedMovies() } zip(popularMovies, topRatedMovies) { popularResults, topRatedResults -> // Filter from popular and top rated movies return filteredResults }.await() } Threading Exception Handling Scalability Transforming results
Threading Exception Handling Scalability Transforming results coroutineScope.launch { val popularMovies = async{ getPopularMovies() } val topRatedMovies = async{ getTopRatedMovies() } zip(popularMovies, topRatedMovies) { popularResults, topRatedResults -> // Filter from popular and top rated movies return filteredResults }.await() } Zip Calls in
Threading Exception Handling Scalability Transforming results coroutineScope.launch { val popularMovies = async{ getPopularMovies() } val topRatedMovies = async{ getTopRatedMovies() } zip(popularMovies, topRatedMovies) { popularResults, topRatedResults -> // Filter from popular and top rated movies return filteredResults }.await() } Zip Calls in
Threading Exception Handling Scalability Transforming results coroutineScope.launch { val popularMovies = async{ getPopularMovies() } val topRatedMovies = async{ getTopRatedMovies() } zip(popularMovies, topRatedMovies) { popularResults, topRatedResults -> // Filter from popular and top rated movies return filteredResults }.await() } Zip Calls in