需求是这样的:我需要先调用在线接口获取数据,拿到数据后调用缓存接口缓存数据,并将在线数据返回到UI。缓存接口调用结果不管是失败还是抛异常,不影响正常流程
试着在协程中开启协程,在withContext(Dispatchers.IO)中执行下面代码
runBlocking {
val data = onlineMethod()
if (data.result) {
async(Dispatchers.Default) {
try {
cacheMethod()
} catch (e: Exception) {
NetExceptionHandle.handleException(e)
}
}
}
data
}
不知道哪里写的有问题吗,如果cacheMethod()抛异常的话会被阻塞住,等到cacheMethod处理完才会返回data。换成线程则可以,如下面代码,会先返回data,cacheMethod会异步处理,不会阻塞在cacheMethod方法上
runBlocking {
val data = onlineMethod()
if (data.result) {
ThreadFactory.instance()?.getFixThreadPool()?.execute {
try {
runBlocking {
cacheMethod()
}
} catch (e: Exception) {
NetExceptionHandle.handleException(e)
}
}
}
data
}
请问我该怎么只用协程实现上面的效果?
// onlineMethod 接口要用 suspend 关键字
//提供一个返回成功 、失败回调:例如
var success:(String)->Unit={}
var error:(Throwable)->Unit={}
viewModelScope.launch {
kotlin.runCatching {
withContext(Dispatchers.IO) {
onlineMethod()
}
}.onSuccess {
if (data.result){
cacheMethod()
//缓存 同时响应结果数据
success("结果数据,也就是 data")
}
else {
// 错误
error(Throwable("接口返回错误信息"))
}
}.onFailure {
//异常处理
error(Throwable("异常信息"))
}
}