android10 / android10/Android-CleanArchitecture-Kotlin

How to auto cancel UseCase job when the ViewModel is destroyed

Offen
#118 4 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Kotlin
Sterne
4.8k
Forks
929
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

I want to auto cancel all UseCase request that is tied to the ViewModel.

For now: I have reigstered a callback for `ViewModel.onCleared()` event. So when the `onCleared()` is called, the callback will be invoked.

````
class BaseViewModel : ViewModel(){
internal var onClearedListener : () -> Unit ={}
override fun onCleared() {
super.onCleared()
onClearedListener.invoke()
}
}
````
For UseCase: I have defined two more functions, `cancelJob()` and `monitorViewModelLifecycle(vm: BaseViewModel)` and added another overloading function `invoke(vm: BaseViewModel,params: Params,onResult: (Either) -> Unit = {})`.

````
abstract class UseCase where Type : Any {
operator fun invoke(
vm: BaseViewModel,
params: Params,
onResult: (Either) -> Unit = {}
) {
monitorViewModelLifecycle(vm)
uiScope.launch { onResult(withContext(Dispatchers.IO) { run(params) }) }
}

//Cancel the current ongoing job
fun cancelJob(message: String = "Abort") {
uiScope.cancel(message)
}

/**
* Monitor the [BaseViewModel] lifecycle.
* The motto is to auto clear any ongoing job that is tied to the [BaseViewModel].
*
* @param vm, [BaseViewModel] instance
*/
fun monitorViewModelLifecycle(vm: BaseViewModel) {
vm.onClearedListener = {
cancelJob()
}
}
}
````

So, When the `ViewModel.onClearedListener` is invoked I'm cancelling the current Job.

Is there any better to way to acheive this?

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.