小编Kam*_*tak的帖子

使用 Kotlin 协程的 NetworkBoundResource

您对如何使用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)

android kotlin kotlin-coroutines

16
推荐指数
2
解决办法
5790
查看次数

标签 统计

android ×1

kotlin ×1

kotlin-coroutines ×1