我有一个应用程序作用域功能,可以像这样从服务器请求访问令牌
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
}
但是当不同存储库中有许多不同的数据请求时,这是正确的使用方法吗?
答案 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){}