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
//Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
testImplementation Dependencies.Testing.junit
androidTestImplementation Dependencies.Testing.androidXJunit
androidTestImplementation Dependencies.Testing.espressoCore

View File

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

View File

@@ -1,32 +1,11 @@
package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.PopularMoviesResponse
import org.koin.core.component.KoinComponent
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class MoviesService: KoinComponent {
private val service by lazy { TmdbClient().createMovieService() }
fun getPopularMovies(page: Int = 1, callback: (isSuccessful: Boolean, response: PopularMoviesResponse?) -> Unit) {
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)
}
})
}
suspend fun getPopularMovies(page: Int = 1) = service.getPopularMovies(page)
}

View File

@@ -1,13 +1,13 @@
package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.PopularTvResponse
import retrofit2.Call
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query
interface TvApi {
@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
import com.owenlejeune.tvtime.api.tmdb.model.PopularTvResponse
import org.koin.core.component.KoinComponent
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class TvService: KoinComponent {
private val service by lazy { TmdbClient().createTvService() }
fun getPopularTv(page: Int = 1, callback: (isSuccessful: Boolean, response: PopularTvResponse?) -> Unit) {
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)
}
})
}
suspend fun getPopularTv(page: Int = 1) = service.getPoplarTv(page)
}

View File

@@ -5,6 +5,10 @@ import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import com.owenlejeune.tvtime.api.tmdb.MoviesService
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)
@Composable
@@ -14,9 +18,12 @@ fun MoviesTab(appNavController: NavController) {
// val movieListItems: LazyPagingItems<PopularMovie> = moviesList.collectAsLazyPagingItems()
PosterGrid(appNavController = appNavController) { moviesList ->
val service = MoviesService()
service.getPopularMovies { isSuccessful, response ->
if (isSuccessful) {
moviesList.value = response!!.movies
CoroutineScope(Dispatchers.IO).launch {
val response = service.getPopularMovies()
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 com.owenlejeune.tvtime.api.tmdb.TvService
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)
@Composable
fun TvTab(appNavController: NavController) {
PosterGrid(appNavController = appNavController) { tvList ->
val service = TvService()
service.getPopularTv { isSuccessful, response ->
if (isSuccessful) {
tvList.value = response!!.tv
CoroutineScope(Dispatchers.IO).launch {
val response = service.getPopularTv()
if (response.isSuccessful) {
withContext(Dispatchers.Main) {
tvList.value = response.body()!!.tv
}
}
}
}