如何在GlobalScope之后将协程的viewModelScope作业入队

时间:2020-01-27 17:01:35

标签: android kotlin kotlin-coroutines

我有一个应用程序作用域功能,可以像这样从服务器请求访问令牌

fun getToken() {
    GlobalScope.launch {
        ...
        val response = webservice.getToken().awaitResponse()
        //save token
    }
}

我还在存储库中提供了一些功能,这些功能可从服务器请求数据并从类似的视图模型启动

//in a ViewModel
fun getData() {
    viewModelScope.launch(Dispatchers.IO) {
        repository.getData()
    }
}

//in a Repository
fun getData() {
    ...
    val response = webservice.getData().awaitResponse()
    //handle response
}

如何确保只有在有访问令牌的情况下才发送数据请求?

我唯一想到的就是在每次这​​样的数据请求之前检查并请求令牌(如果需要)

fun getData() {
    var response: Response
    token?.let {
        response = webservice.getToken().awaitResponse()
        //save token
    }
    ...
    response = webservice.getData().awaitResponse()
    //handle response
}

但是当不同存储库中有许多不同的数据请求时,这是正确的使用方法吗?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

object InternalScope {
    private val tokenJob = GlobalScope.launch {
        response = webservice.getToken().awaitResponse()
    }

    suspend fun <T> runWithContext(
        context: CoroutineContext,
        block: suspend CoroutineScope.() -> T
    ): T {
        tokenJob.join()
        return withContext(context, block)
    }
}

您可以像这样使用它:

InternalScope.runWithContext(Dispatchers.IO){}