replace retrofit calls with coroutines

This commit is contained in:
Owen LeJeune
2022-02-10 21:44:41 -05:00
parent d0a08307d8
commit d2571bc386
7 changed files with 29 additions and 52 deletions

View File

@@ -79,6 +79,9 @@ dependencies {
implementation Dependencies.Coil.coil implementation Dependencies.Coil.coil
//Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
testImplementation Dependencies.Testing.junit testImplementation Dependencies.Testing.junit
androidTestImplementation Dependencies.Testing.androidXJunit androidTestImplementation Dependencies.Testing.androidXJunit
androidTestImplementation Dependencies.Testing.espressoCore androidTestImplementation Dependencies.Testing.espressoCore

View File

@@ -1,14 +1,13 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.PopularMoviesResponse import com.owenlejeune.tvtime.api.tmdb.model.PopularMoviesResponse
import retrofit2.Call import retrofit2.Response
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Query import retrofit2.http.Query
interface MoviesApi { interface MoviesApi {
@GET("movie/popular") @GET("movie/popular")
fun getPopularMovies(@Query("page") page: Int = 1): Call<PopularMoviesResponse> suspend fun getPopularMovies(@Query("page") page: Int = 1): Response<PopularMoviesResponse>
// suspend fun getPopularMovies(@Query("page") page: Int = 1): PopularMoviesResponse
} }

View File

@@ -1,32 +1,11 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.PopularMoviesResponse
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class MoviesService: KoinComponent { class MoviesService: KoinComponent {
private val service by lazy { TmdbClient().createMovieService() } private val service by lazy { TmdbClient().createMovieService() }
fun getPopularMovies(page: Int = 1, callback: (isSuccessful: Boolean, response: PopularMoviesResponse?) -> Unit) { suspend fun getPopularMovies(page: Int = 1) = service.getPopularMovies(page)
service.getPopularMovies(page = page).enqueue(object : Callback<PopularMoviesResponse> {
override fun onResponse(
call: Call<PopularMoviesResponse>,
response: Response<PopularMoviesResponse>
) {
response.body()?.let { body ->
callback.invoke(true, body)
} ?: run {
callback.invoke(false, null)
}
}
override fun onFailure(call: Call<PopularMoviesResponse>, t: Throwable) {
callback.invoke(false, null)
}
})
}
} }

View File

@@ -1,13 +1,13 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.PopularTvResponse import com.owenlejeune.tvtime.api.tmdb.model.PopularTvResponse
import retrofit2.Call import retrofit2.Response
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Query import retrofit2.http.Query
interface TvApi { interface TvApi {
@GET("tv/popular") @GET("tv/popular")
fun getPoplarTv(@Query("page") page: Int = 1): Call<PopularTvResponse> suspend fun getPoplarTv(@Query("page") page: Int = 1): Response<PopularTvResponse>
} }

View File

@@ -1,28 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.PopularTvResponse
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class TvService: KoinComponent { class TvService: KoinComponent {
private val service by lazy { TmdbClient().createTvService() } private val service by lazy { TmdbClient().createTvService() }
fun getPopularTv(page: Int = 1, callback: (isSuccessful: Boolean, response: PopularTvResponse?) -> Unit) { suspend fun getPopularTv(page: Int = 1) = service.getPoplarTv(page)
service.getPoplarTv(page = page).enqueue(object : Callback<PopularTvResponse> {
override fun onResponse(call: Call<PopularTvResponse>, response: Response<PopularTvResponse>) {
response.body()?.let { body ->
callback.invoke(true, body)
} ?: run {
callback.invoke(false, null)
}
}
override fun onFailure(call: Call<PopularTvResponse>, t: Throwable) {
callback.invoke(false, null)
}
})
}
} }

View File

@@ -5,6 +5,10 @@ import androidx.compose.runtime.Composable
import androidx.navigation.NavController import androidx.navigation.NavController
import com.owenlejeune.tvtime.api.tmdb.MoviesService import com.owenlejeune.tvtime.api.tmdb.MoviesService
import com.owenlejeune.tvtime.ui.components.PosterGrid import com.owenlejeune.tvtime.ui.components.PosterGrid
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
@@ -14,9 +18,12 @@ fun MoviesTab(appNavController: NavController) {
// val movieListItems: LazyPagingItems<PopularMovie> = moviesList.collectAsLazyPagingItems() // val movieListItems: LazyPagingItems<PopularMovie> = moviesList.collectAsLazyPagingItems()
PosterGrid(appNavController = appNavController) { moviesList -> PosterGrid(appNavController = appNavController) { moviesList ->
val service = MoviesService() val service = MoviesService()
service.getPopularMovies { isSuccessful, response -> CoroutineScope(Dispatchers.IO).launch {
if (isSuccessful) { val response = service.getPopularMovies()
moviesList.value = response!!.movies if (response.isSuccessful) {
withContext(Dispatchers.Main) {
moviesList.value = response.body()!!.movies
}
} }
} }
} }

View File

@@ -5,15 +5,22 @@ import androidx.compose.runtime.Composable
import androidx.navigation.NavController import androidx.navigation.NavController
import com.owenlejeune.tvtime.api.tmdb.TvService import com.owenlejeune.tvtime.api.tmdb.TvService
import com.owenlejeune.tvtime.ui.components.PosterGrid import com.owenlejeune.tvtime.ui.components.PosterGrid
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun TvTab(appNavController: NavController) { fun TvTab(appNavController: NavController) {
PosterGrid(appNavController = appNavController) { tvList -> PosterGrid(appNavController = appNavController) { tvList ->
val service = TvService() val service = TvService()
service.getPopularTv { isSuccessful, response -> CoroutineScope(Dispatchers.IO).launch {
if (isSuccessful) { val response = service.getPopularTv()
tvList.value = response!!.tv if (response.isSuccessful) {
withContext(Dispatchers.Main) {
tvList.value = response.body()!!.tv
}
} }
} }
} }