使用示例
var req = UserPublic.LoginReq.newBuilder().setEmail(email).setPassword(password).build()
val method = UserGrpc.newBlockingStub(MockConfig.channel)::login
asyncTask(req, method) {
showUserInfo(it)
}
實(shí)現(xiàn)機(jī)制:泛型方法+高階函數(shù)
fun <Req, Resp> asyncTask(req: Req, function: (Req) -> Resp?, errorHandler: (Throwable) -> Any = SystemConfig.defaultErrorHandler, consumer: (Resp?) -> Any) {
val errorHandler = CoroutineExceptionHandler { _, exception ->
errorHandler.invoke(exception)
}
launch(errorHandler) {
var resp = async(Dispatchers.IO) {
function.invoke(req)
}.await()
consumer.invoke(resp)
}
}
它有默認(rèn)的錯(cuò)誤處理记罚,也可以自定義錯(cuò)誤處理须教,默認(rèn)的話缀壤,只是打印一下錯(cuò)誤宝剖,可以自己重寫(xiě)errorHandler參數(shù)
class SystemConfig {
companion object {
val defaultErrorHandler: (Throwable) -> Any = { exception ->
{
LogUtils.print("Caught $exception")
}
}
}
}
優(yōu)點(diǎn)
- 將業(yè)務(wù)代碼和模板代碼分離病袄,就算以后不用協(xié)程了搂赋,也可以很方便的切換成其它線程調(diào)度框架
- 方便后期拓展赘阀,現(xiàn)在的模板代碼只是做了線程切換,以后可以加上加載進(jìn)度條的顯示和隱藏等等