package com.xyj.checkupgrade.extendimport androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent//定义一个DSL风格的LifecycleObserver
class LifecycleObserverKt(listenerBuilder: ListenerBuilder.() -> Unit) : LifecycleObserver {private val mListener: ListenerBuilder = ListenerBuilder().also(listenerBuilder)@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun onCreate() = mListener.mCreateAction?.invoke()@OnLifecycleEvent(Lifecycle.Event.ON_START)fun onStart() = mListener.mStartAction?.invoke()@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun onResume() = mListener.mResumeAction?.invoke()@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)fun onPause() = mListener.mPauseAction?.invoke()@OnLifecycleEvent(Lifecycle.Event.ON_STOP)fun onStop() = mListener.mStopAction?.invoke()@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)fun onDestroy() = mListener.mDestroyAction?.invoke()@OnLifecycleEvent(Lifecycle.Event.ON_ANY)fun onAny() = mListener.mAnyAction?.invoke()inner class ListenerBuilder {internal var mPauseAction: (() -> Unit)? = nullinternal var mStartAction: (() -> Unit)? = nullinternal var mStopAction: (() -> Unit)? = nullinternal var mCreateAction: (() -> Unit)? = nullinternal var mDestroyAction: (() -> Unit)? = nullinternal var mResumeAction: (() -> Unit)? = nullinternal var mAnyAction: (() -> Unit)? = nullfun onAny(action: () -> Unit) {mAnyAction = action}fun onCreate(action: () -> Unit) {mCreateAction = action}fun onStart(action: () -> Unit) {mStartAction = action}fun onResume(action: () -> Unit) {mResumeAction = action}fun onPause(action: () -> Unit) {mPauseAction = action}fun onStop(action: () -> Unit) {mStopAction = action}fun onDestroy(action: () -> Unit) {mDestroyAction = action}}}
复制代码

使用方法:

//启动一个可以监听activity生命周期并且自动取消的协程
fun AppCompatActivity.launchWithLifecycle(block: suspend CoroutineScope.() -> Unit) {val job = CoroutineScope(Dispatchers.Main).launch {block()}lifecycle.addObserver(LifecycleObserverKt{onDestroy {job.cancel()}})
}
复制代码

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

定义一个DSL风格的LifecycleObserver(Kotlin)相关推荐

  1. Spark SQL概述,DataFrames,创建DataFrames的案例,DataFrame常用操作(DSL风格语法),sql风格语法

    一. Spark SQL 1. Spark SQL概述 1.1. 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作 ...

  2. python turtle画气球-如何用python的装饰器定义一个像C++一样的强

    如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...

  3. Golang Web入门(2):如何实现一个RESTful风格的路由

    Golang Web入门(2):如何实现一个RESTful风格的路由 摘要 在上一篇文章中,我们聊了聊在Golang中怎么实现一个Http服务器.但是在最后我们可以发现,固然DefaultServeM ...

  4. 经典算法面试题目-翻转一个C风格的字符串(1.2)

    题目: Write code to reverse a C-Style String. (C-String means that "abcd" is represented as ...

  5. java开发定义一个好的变量名

    如何定义一个好的变量名 在日常编程中最烦恼的就是给变量取名,一段好代码,既要能完美地运行,还要能较容易地维护.这就意味着需要让日后维护代码的人能很快地看懂你的代码,而且,在团队合作中,其他开发者也会经 ...

  6. (转载) 如何定义一个号的变量名

    如何定义一个好的变量名 在日常编程中最烦恼的就是给变量取名,一段好代码,既要能完美地运行,还要能较容易地维护.这就意味着需要让日后维护代码的人能很快地看懂你的代 码,而且,在团队合作中,其他开发者也会 ...

  7. 使用 C++ 创建你的第一个 Metro 风格应用

    WindowsMetro 风格应用专门针对 Windows 8 Consumer Preview 所提供的用户体验量身定制.每个出色的 Metro 风格应用都遵循特定的设计准则,这使得此类应用与传统的 ...

  8. 定义一个属性_Python property属性

    1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ###############class Foo: def ...

  9. Swift中使用typealias定义一个闭包closure

    在OC中我们定义一个Blocks是这样定义的: typedef void (^ZWProgressHUDCompletionBlock)(); 在Swift中定义一个闭包是这种: typealias ...

最新文章

  1. Bioinformatics|癌症细胞系的用药反应预测
  2. 学python要基础吗-自学Python要有其他语言基础吗?
  3. maven 打jar包将配置文件,和lib包打在外面
  4. linux下初次安装mysql使用指南
  5. office 2010中自带的 微软拼音输入法2010卸载
  6. 如何在面试结束后反问面试技术官?
  7. java怎么写网络爬虫_教你如何编写简单的网络爬虫
  8. 为什么要用implements Serializable
  9. 怎么让图片居中php,怎么让CSS文件里图片居中
  10. 斗战神 拳猴刷图加点
  11. AMEsim2019.2的安装和matlab2019的联合仿真
  12. ACM算法模板小汇总
  13. 金融分析与风险管理——资本资产定价模型
  14. 杨超越杯编程大赛,参赛作品过100个,工程师评论:杨超越是谁?
  15. Scrapy 爬虫框架(基础)
  16. mac用什么写python程序_macos,python_大家在mac系统都用什么编辑器写python程序?,macos,python - phpStudy...
  17. python之plt.figure
  18. jsp执行原理(详解)
  19. 用计算机观察声音的波形,用几何画板观察声音的波形
  20. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB

热门文章

  1. 比尔·盖茨8000万美元买地建智慧城市,准备打造美国版“雄安新区”
  2. 为什么数据库连接池不采用 IO 多路复用?
  3. 再见了!面试八股文。。。
  4. 面试官:Java中 serialVersionUID 的作用是什么?举个例子说明
  5. 抛弃P值,选择更直观的A/B测试!
  6. 逻辑回归 + GBDT模型融合实战!
  7. 最常见核心的决策树算法—ID3、C4.5、CART(非常详细)
  8. 中科院团队用算法追上谷歌“量子霸权”:谷歌量子处理器并没有比E级超算快...
  9. ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法
  10. GitHub:数据科学最全资料集合