我有这样的视图模型
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
或更高。