我是否正确取消了协程



我有这样的视图模型

class StorageValidationViewModel: ViewModel(), CoroutineScope {
//Coroutines
private val _job = SupervisorJob()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + _job
override fun onCleared() {
super.onCleared()
coroutineContext.cancel()
}
......
}

我有一些方法可以通过启动协程的Retrofit进行网络调用

fun getStorageLocations(){
launch {
var locations:List<StorageLocationData>? = null
try {
locations = _storageLocationRepository.getAllStorageLocations()
}catch (e:IOException){
e.printStackTrace()
}
storageLocationsLiveData.postValue(locations)
}
}

一切正常,但我有一种感觉,当 ViewModel 被清除时,我没有正确取消协程,因为我实际上并没有在任何地方使用coroutineContext,从而产生了内存泄漏

我应该做吗

launch(coroutineContext){
//API call?
}

还是我做的很好?我只是想确保我正在做的事情不会产生内存泄漏

您的实现不会创建内存泄漏。coroutineContext: CoroutineContext是从CoroutineScope继承时必须实现的属性。使用协程生成器启动协程时launch它使用覆盖的coroutineContext上下文,因此无需将其显式传递给launch()构建器。

ViewModel中使用协程有更直接的方法。viewModelScope属性可用于启动协程,而无需从CoroutineScope继承:

class MyViewModel: ViewModel() {
init {
viewModelScope.launch {
// Coroutine that will be canceled when the ViewModel is cleared.
}
}
}

并且无需在onCleared()方法中显式取消作业。

对于viewModelScope,请使用androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0或更高。

相关内容

  • 没有找到相关文章

最新更新