What is the recommended way to handle periodic calls in ViewModels and cancel them after navigating to a different screen?
say I have a ViewModel:
@HiltViewModel
class SomeViewModel @Inject constructor(
private val someUseCase: SomeUseCase,
) : ViewModel() {
private var periodicJob: Job? = null
fun startPeriodic() {
periodicJob?.cancel()
periodicJob = viewModelScope.launch {
while (true) {
someUseCase()
delay(1000)
}
}
}
fun endPeriodic() {
periodicJob?.cancel()
}
}
And then in the composable I do:
DisposableEffect(viewModel) {
viewModel.startPolling()
onDispose {
viewModel.endPolling()
}
}
Is this the correct way? I've also tried simply launching the while loop in ViewModel's init, but that was never stopped. ViewModel is passed as parameter as following:
@Composable
fun SomeScreen(
viewModel: SomeViewModel = hiltViewModel(),
) { ... }