From d6afc2bad0d30e9f9932c41b82f8dac25e483e99 Mon Sep 17 00:00:00 2001 From: Vixb1122 Date: Tue, 20 Apr 2021 15:45:08 +0800 Subject: [PATCH] Update UseCase --- .../sample/core/interactor/UseCase.kt | 15 ++++++++------- .../features/movies/MovieDetailsViewModel.kt | 10 ++++++++-- .../sample/features/movies/MoviesViewModel.kt | 4 +++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/interactor/UseCase.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/interactor/UseCase.kt index 1dd50432..c814f0e1 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/interactor/UseCase.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/interactor/UseCase.kt @@ -17,10 +17,7 @@ package com.fernandocejas.sample.core.interactor import com.fernandocejas.sample.core.exception.Failure import com.fernandocejas.sample.core.functional.Either -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.async -import kotlinx.coroutines.launch +import kotlinx.coroutines.* /** * Abstract class for a Use Case (Interactor in terms of Clean Architecture). @@ -34,9 +31,13 @@ abstract class UseCase where Type : Any { abstract suspend fun run(params: Params): Either - operator fun invoke(params: Params, onResult: (Either) -> Unit = {}) { - val job = GlobalScope.async(Dispatchers.IO) { run(params) } - GlobalScope.launch(Dispatchers.Main) { onResult(job.await()) } + operator fun invoke(params: Params, scope: CoroutineScope = GlobalScope, onResult: (Either) -> Unit = {}) { + scope.launch(Dispatchers.Main) { + val deferred = async(Dispatchers.IO) { + run(params) + } + onResult(deferred.await()) + } } class None diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt index 27cbb885..2e7102bd 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt @@ -17,6 +17,7 @@ package com.fernandocejas.sample.features.movies import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.fernandocejas.sample.core.platform.BaseViewModel import com.fernandocejas.sample.features.movies.GetMovieDetails.Params import javax.inject.Inject @@ -29,9 +30,14 @@ class MovieDetailsViewModel val movieDetails: LiveData = _movieDetails fun loadMovieDetails(movieId: Int) = - getMovieDetails(Params(movieId)) { it.fold(::handleFailure, ::handleMovieDetails) } + getMovieDetails(Params(movieId), viewModelScope) { + it.fold( + ::handleFailure, + ::handleMovieDetails + ) + } - fun playMovie(url: String) = playMovie(PlayMovie.Params(url)) + fun playMovie(url: String) = playMovie(PlayMovie.Params(url), viewModelScope) private fun handleMovieDetails(movie: MovieDetails) { _movieDetails.value = MovieDetailsView(movie.id, movie.title, movie.poster, diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt index dc06bfb4..685f114f 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt @@ -17,6 +17,7 @@ package com.fernandocejas.sample.features.movies import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.fernandocejas.sample.core.interactor.UseCase.None import com.fernandocejas.sample.core.platform.BaseViewModel import javax.inject.Inject @@ -27,7 +28,8 @@ class MoviesViewModel private val _movies: MutableLiveData> = MutableLiveData() val movies: LiveData> = _movies - fun loadMovies() = getMovies(None()) { it.fold(::handleFailure, ::handleMovieList) } + fun loadMovies() = + getMovies(None(), viewModelScope) { it.fold(::handleFailure, ::handleMovieList) } private fun handleMovieList(movies: List) { _movies.value = movies.map { MovieView(it.id, it.poster) }