您对如何使用NetworkBoundResource和 Kotlin 协程实现存储库模式有任何想法吗?我知道我们可以使用 GlobalScope 启动协程,但这可能会导致协程泄漏。我想传递一个viewModelScope作为参数,但在实现时有点棘手(因为我的存储库不知道任何 ViewModel 的 CoroutineScope)。
abstract class NetworkBoundResource<ResultType, RequestType>
@MainThread constructor(
private val coroutineScope: CoroutineScope
) {
private val result = MediatorLiveData<Resource<ResultType>>()
init {
result.value = Resource.loading(null)
@Suppress("LeakingThis")
val dbSource = loadFromDb()
result.addSource(dbSource) { data ->
result.removeSource(dbSource)
if (shouldFetch(data)) {
fetchFromNetwork(dbSource)
} else {
result.addSource(dbSource) { newData ->
setValue(Resource.success(newData))
}
}
}
}
@MainThread
private fun setValue(newValue: Resource<ResultType>) {
if (result.value != newValue) {
result.value = newValue
}
}
private fun fetchFromNetwork(dbSource: LiveData<ResultType>) …Run Code Online (Sandbox Code Playgroud)