博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin DSL 实战
阅读量:7118 次
发布时间:2019-06-28

本文共 1422 字,大约阅读时间需要 4 分钟。

目标

首先,定义好异步结果泛化类型AsyncResult,此处会用到Kotlin泛型编程基础知识:

sealed class AsyncResult
data class AsyncSuccess
(val data: T?) : AsyncResult
()data class AsyncError(val error: String?) : AsyncResult
()inline fun
AsyncResult
.onSuccess(action: (T?) -> Unit): AsyncResult
{ if (this is AsyncSuccess) action(data) return this}inline fun
AsyncResult
.onError(action: (String) -> Unit) { if (this is AsyncError && error != null) action(error)}复制代码

基于此AsyncResult和Kotlin协程suspend关键字,可以定义任意异步操作(网络请求,数据库操作等)如下:

suspend fun demoAction(): AsyncResult
> { //请暂时忽略实现方法 }复制代码

接下来好戏登场,UI部分的代码:

launch {            demoAction()                .onSuccess {                    Toast.makeText(this@MainActivity, "Successfully Fetched ${it?.size} Items", Toast.LENGTH_LONG)                        .show()                }                .onError {                    Toast.makeText(this@MainActivity, "Failed!! -- $it", Toast.LENGTH_LONG).show()                }        } 复制代码

非常优雅有木有?!

具体操作(实现)

展示过了魔术效果, 我们来揭秘下几处关键手法:

  • sealed class 描述了受限的类继承结构,即限定了此类实例只能是有限的几种类型。 AsyncSuccess和AsyncError则是AsyncResult的派生类而已。
  • onSuccess和oError是AsyncResult的扩展方法(Kotlin可以给已知的任何 class 类添加函数), 其中onSuccess还返回了自身对象,以便链式调用。
  • onSuccess和onError均接受唯一一个Lambda参数, 从而可以实现形式上onSuccess{}.onError{}的写法。

转载于:https://juejin.im/post/5cb94bd96fb9a0689d6f9ab5

你可能感兴趣的文章
【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验
查看>>
spring -boot s-tarter 详解
查看>>
在canvas上面绘制图片--drawImage实例
查看>>
进程管理工具Supervisor(二)Events
查看>>
vscode打造最佳的markdown编辑器
查看>>
命令行批量合并视频脚本
查看>>
postman发送json格式的post请求
查看>>
chattr的使用
查看>>
Java基础-反射(reflect)技术详解
查看>>
查询上周的数据
查看>>
C++ 异常
查看>>
Csharp: Listview convert Datatable and ListView.Group count
查看>>
艾伟也谈项目管理,工作感言:任务分配及管理
查看>>
扩展方法及几种常见的代理(delegate)语法
查看>>
[图像]用Matlab在图像上画矩形框
查看>>
lisp 笔记 - 闭包
查看>>
NSCharacterSet(只保留textField中输入的数字)
查看>>
教程-经典Delphi教程网
查看>>
使用token机制来验证用户的安全性-b
查看>>
Spring Cloud Feign 出现ClassNotFoundException: feign.Feign$Builder错误
查看>>