Skip to content

Instantly share code, notes, and snippets.

View jhonatansabadi's full-sized avatar
🏠
Working from home

Jhonatan Sabadi jhonatansabadi

🏠
Working from home
View GitHub Profile

Guia completo sobre viewModelScope e conceitos de Coroutines

Bom, se você já utiliza Coroutines e sua arquitetura é a MVVM ou então Clean Architecture, ou até uma mistura dos dois, você provavelmente já ouviu falar de viewModelScope.

De forma bem resumida, o viewModeScope nada mais é do que um coroutineScope, ou seja, um bloco onde eu posso executar minhas coroutines sem travar a thread em que estou executando.

Ele respeita o ciclo de vida do seu ViewModel, o que facilita o cancelamento de coroutines que não são mais necessárias, evitando assim o temido memory leak 👻  .

Tá... então se eu tenho uma suspend fun e quero executar do meu ViewModel, é só só colocar dentro do viewModelScope que vai estar tudo certo e meu app não vai travar e minha MainThread vai ficar livre??

class GetUserByIdUseCase(
private val dispatcher: CoroutineDispatcher = Dispatcher.IO,
private val userRepository: UserRepository
) {
suspend fun invoke(id: String): User {
return withContext(dispatcher) {
userRepository.getUserById(id)
}
}
}
viewModelScope.launch {
_myLiveData.postValue("result 1")
_myLiveData.value("result 2")
}
viewModelScope.launch(Dispatcher.IO) {
val result = apiCall()
_myLiveData.postValue(result)
}
viewModelScope.launch(Dispatcher.IO) {
/// Chamada de API
}
viewModelScope.launch(Dispatcher.IO) {
val result = apiCall()
_myLiveData.value = result
}
fun setUser() {
viewModelScope.launch {
// ...
}
}
fun setUser(): User {
viewModelScope.launch {
val name = getNameFromApi()
val lastName = getLastNameFromApi()
_user.value = User(name, lastName)
}
}
fun setUserConfigurations(): User {
viewModelScope.launch {
//agora sim é o viewModelScope :)
viewModelScope.launch {
val name = getNameFromApi()
val lastName = getLastNameFromApi()
val user = User(name, lastName)
//....
}
//NÃO é o viewModelScope
coroutineScope.launch {
val name = getNameFromApi()
val lastName = getLastNameFromApi()
val user = User(name, lastName)
//....
}