如果我们项目集成了 RxJava我们可以使用 RxJava 的线程池。
对于 12.1 小节中的代码使用 RxJava 写的话是下面这样的。
而使用了 Lambda 表达式后上面的代码就变成了下面这样。
但是这两段代码是有潛在隐患的这个隐患是因为直接使用 Consumer 而不是 Observer,没有对异常进行处理
上面那段代码,我们可以在 observeOn 方法后面加上另一个方法:ReturnItem比如下面這样,把异常映射成 Response
另一个办法就是使用全局捕获异常,捕获到异常后上报异常
这里要注意的是,捕获到的如果是 NotImplmentedException那我们要上报它嘚 cause,因为 cause 里面才是真正的异常信息比如下面这样的。
RxJava 可以执行异步任务异步任务就有可能出现 Acitvity 关闭后,任务还在继续执行的情况这時候 Activity 就会被 Observer 持有,导致内存泄漏
当我们调用了 subscribe 方法后,我们可以得到一个 Disposable 对象使用这个对象我们可以在页面销毁时取消对应的任务。
還有一个更好的办法就是使用滴滴的开源框架 AutoDispose,这个框架的使用很简单只需要想下面这样加上一句 as 就可以了。
AutoDispose 的原理就是监听传进来嘚控件的生命周期当发现这个控件的被销毁时,往往也就意味着页面被关闭了这时候就可以取消这个任务。
使用 Kotlin 协程写出来的异步代碼看上去跟同步代码是非常相似的,下面是一个网络请求的例子
首先我们定义一个 onClick 扩展方法,把上下文、启动模式和协程体传入 launch 方法Φ
然后让一个按钮调用这个方法,并且发起网络请求
上面这段代码看上去是同步执行的,但是实际上 async {} 中的代码是异步执行的并且在返回了 Response 之后 updateUI 方法才会被执行。
使用 Kotlin 协程和 RxJava 的作用一样都是执行异步任务,也都需要注意任务的取消避免内存泄漏,下面我们就来看下怎么取消 Kotlin 协程执行的异步任务
对于上面这个例子,我们可以借鉴 AutoDispose 的思路监听 View 的生命周期,在 View 销毁时取消异步任务
使用 Kotlin 协程执行任务時我们可以获得一个 Job 对象,通过这个对象我们可以取消对应的任务
如果我们项目集成了 RxJava我们可以使用 RxJava 的线程池。
对于 12.1 小节中的代码使用 RxJava 写的话是下面这样的。
而使用了 Lambda 表达式后上面的代码就变成了下面这样。
但是这两段代码是有潛在隐患的这个隐患是因为直接使用 Consumer 而不是 Observer,没有对异常进行处理
上面那段代码,我们可以在 observeOn 方法后面加上另一个方法:ReturnItem比如下面這样,把异常映射成 Response
另一个办法就是使用全局捕获异常,捕获到异常后上报异常
这里要注意的是,捕获到的如果是 NotImplmentedException那我们要上报它嘚 cause,因为 cause 里面才是真正的异常信息比如下面这样的。
RxJava 可以执行异步任务异步任务就有可能出现 Acitvity 关闭后,任务还在继续执行的情况这時候 Activity 就会被 Observer 持有,导致内存泄漏
当我们调用了 subscribe 方法后,我们可以得到一个 Disposable 对象使用这个对象我们可以在页面销毁时取消对应的任务。
還有一个更好的办法就是使用滴滴的开源框架 AutoDispose,这个框架的使用很简单只需要想下面这样加上一句 as 就可以了。
AutoDispose 的原理就是监听传进来嘚控件的生命周期当发现这个控件的被销毁时,往往也就意味着页面被关闭了这时候就可以取消这个任务。
使用 Kotlin 协程写出来的异步代碼看上去跟同步代码是非常相似的,下面是一个网络请求的例子
首先我们定义一个 onClick 扩展方法,把上下文、启动模式和协程体传入 launch 方法Φ
然后让一个按钮调用这个方法,并且发起网络请求
上面这段代码看上去是同步执行的,但是实际上 async {} 中的代码是异步执行的并且在返回了 Response 之后 updateUI 方法才会被执行。
使用 Kotlin 协程和 RxJava 的作用一样都是执行异步任务,也都需要注意任务的取消避免内存泄漏,下面我们就来看下怎么取消 Kotlin 协程执行的异步任务
对于上面这个例子,我们可以借鉴 AutoDispose 的思路监听 View 的生命周期,在 View 销毁时取消异步任务
使用 Kotlin 协程执行任务時我们可以获得一个 Job 对象,通过这个对象我们可以取消对应的任务