From 451137e8fa226db1a6e110e46be905d0957f4199 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 19 Jan 2023 17:56:22 -0500 Subject: [PATCH] handling co-routines with viewModel Scope --- .../amethyst/ui/screen/FeedViewModel.kt | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 71a3fb09a..045de3604 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NostrChannelFeedViewModel: FeedViewModel(NostrChannelDataSource) class NostrChatroomListFeedViewModel: FeedViewModel(NostrChatroomListDataSource) @@ -43,50 +44,39 @@ abstract class FeedViewModel(val dataSource: NostrDataSource): ViewModel() val feedContent = _feedContent.asStateFlow() fun refresh() { - val scope = CoroutineScope(Job() + Dispatchers.IO) - scope.launch { - refreshSuspended() - } - } + viewModelScope.launch(Dispatchers.IO) { + val notes = dataSource.loadTop() - private fun refreshSuspended() { - val notes = dataSource.loadTop() - - val oldNotesState = feedContent.value - if (oldNotesState is FeedState.Loaded) { - if (notes != oldNotesState.feed) { - updateFeed(notes) + val oldNotesState = feedContent.value + if (oldNotesState is FeedState.Loaded) { + if (notes != oldNotesState.feed) { + withContext(Dispatchers.Main) { + updateFeed(notes) + } + } + } else { + withContext(Dispatchers.Main) { + updateFeed(notes) + } } - } else { - updateFeed(notes) } } fun updateFeed(notes: List) { - val scope = CoroutineScope(Job() + Dispatchers.Main) - scope.launch { - if (notes.isEmpty()) { - _feedContent.update { FeedState.Empty } - } else { - _feedContent.update { FeedState.Loaded(notes) } - } + if (notes.isEmpty()) { + _feedContent.update { FeedState.Empty } + } else { + _feedContent.update { FeedState.Loaded(notes) } } } - fun refreshCurrentList() { - val state = feedContent.value - if (state is FeedState.Loaded) { - _feedContent.update { FeedState.Loaded(state.feed) } - } - } - - val scope = CoroutineScope(Job() + Dispatchers.IO) var handlerWaiting = false @Synchronized fun invalidateData() { if (handlerWaiting) return handlerWaiting = true + val scope = CoroutineScope(Job() + Dispatchers.IO) scope.launch { delay(100) refresh()