异步任务的极简处理

使用示例

var req = UserPublic.LoginReq.newBuilder().setEmail(email).setPassword(password).build()
val method = UserGrpc.newBlockingStub(MockConfig.channel)::login
asyncTask(req, method) {
    showUserInfo(it)
}

实现机制:泛型方法+高阶函数

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)
    }
}

它有默认的错误处理,也可以自定义错误处理,默认的话,只是打印一下错误,可以自己重写errorHandler参数

class SystemConfig {
    companion object {
        val defaultErrorHandler: (Throwable) -> Any = { exception ->
            {
                LogUtils.print("Caught $exception")
            }
        }
    }
}

优点

  1. 将业务代码和模板代码分离,就算以后不用协程了,也可以很方便的切换成其它线程调度框架
  2. 方便后期拓展,现在的模板代码只是做了线程切换,以后可以加上加载进度条的显示和隐藏等等

推荐阅读更多精彩内容

  • 1 什么是异步编程 通过学习相关概念,我们逐步解释异步编程是什么。 1.1 阻塞 程序未得到所需计算资源时被挂起的...
    hugoren阅读 2,352评论 2 10
  • 原文链接:https://github.com/EasyKotlin 在常用的并发模型中,多进程、多线程、分布式是...
    JackChen1024阅读 10,243评论 3 23
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    小徐andorid阅读 2,679评论 3 53
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,430评论 0 8
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 14,683评论 2 11
  • 七绝(平水韵) 文/盛行(原创) 宋说承留袭九分, 商民黑白博千斤。 三司不晓劳耕事, 只愿粮钱入几文。
    当代艺术阅读 125评论 0 2
  • 30岁的青春年华,作为品学兼优的员工,单位半年的教学秘书,井井有条的安排着进修生、实习生的对接,大家都绝口称好。体...
    指尖琴音阅读 71评论 0 0
  • 我们可能都是属于这个时代同时又不属于这个时代的。
    鹿未眠眠眠阅读 60评论 0 0
  • 《桃夭》不仅是一首祝贺正值青春年华的姑娘出嫁的诗,同时也是一首对女性的赞歌,对母亲的颂歌。明艳的姑娘要出嫁,带着美...
    李非凡不非凡阅读 3,516评论 0 1
  • 狭窄路边有个摊位 摆卖着各种小动物 画眉在梳理着羽毛 兔子则是一脸呆萌 只有一只黑色松鼠 在笼子里不停窜跳 那渴望...
    读书女子阅读 186评论 0 1