半行代碼綁定協(xié)程生命周期
純屬娛樂!
廢話不多說,直接上代碼麻诀!
GlobalScope.launch(Dispatchers.IO){
}.lifeRecycle(lifecycle) <<<<在這里
沒錯就是這么簡單。就是半行代碼傲醉!
先說一下原理
在AndroidX中Activity的生命周期的監(jiān)聽可以使用lifecycle
。
lifecycle.addObserver(LifecycleObserver)
使用這個觀察者監(jiān)聽當前activity的生命周期變化呻率。
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_DESTROY) {
//activity destroy
}
}
})
所以我所實現(xiàn)的步驟就是通過觀察activity的生命周期執(zhí)行協(xié)程的cancel
函數(shù)硬毕。
要使用這種方式難免要封裝一下。
我看過網(wǎng)上有一個庫RxLife-Coroutine 我細看了一下礼仗,他的方式有一些將協(xié)程原本的代碼書寫方式修改了吐咳。隨也是一種方式逻悠,不過對于一些就項目不是很好的接入。
于是我靈雞一動韭脊,想到不如用擴展函數(shù)童谒。在不破壞源代碼(這里的指的是現(xiàn)有使用協(xié)程的項目)的情況下,快速接入沪羔,一鍵完成生命周期的綁定饥伊。
所以就有了這樣的代碼:
launch
使用
GlobalScope.launch(Dispatchers.IO){
}.lifeRecycle(lifecycle) <<<<在這里
async
使用
GlobalScope.async(Dispatchers.IO){
}.lifeRecycle(lifecycle) <<<<在這里
runBlocking
使用
runBlocking(Dispatchers.IO) {
lifeRecycle(lifecycle) <<<<在這里
}
withContext
使用
withContext(Dispatchers.Main){
lifeRecycle(lifecycle) <<<<在這里
}
有沒有很簡潔的樣子
我是這么做的
1.要先找到給誰擴展
我看了部分源碼找到了這幾個類 Job
,Deferred<T>
,CoroutineScope
Job
就是使用launch
函數(shù)的時候的返回值它持有cancel
函數(shù)
Deferred<T>
繼承自Job
public interface Deferred<out T> : Job {
//...
}
CoroutineScope
是協(xié)程執(zhí)行范圍可在執(zhí)行期間cancel
自己這個cancel
是CoroutineScope
的擴展函數(shù)
public fun CoroutineScope.cancel(cause: CancellationException? = null) {
//。蔫饰。琅豆。。篓吁。茫因。
}
而我們通用的幾個協(xié)程函數(shù)取消的控制也就這幾個可以控制,所以我找到了給誰擴展杖剪。
2.如何擴展
先給Job
擴展一個
fun Job.lifeRecycle(lifecycle: Lifecycle): Job {
return this
}
就是這么簡單冻押,但為什么要return
回去呢,為了不破壞原代碼的結(jié)構(gòu)。減少異常的處理盛嘿。
我們要使用activity的lifecycle添加一個觀察器
fun Job.lifeRecycle(lifecycle: Lifecycle): Job {
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_DESTROY) {
cancelChildren()
cancel()
}
}
})
return this
}
看是不是很簡單洛巢!
我的思路很簡單。代碼量也很少孩擂。
我也寫了一個相關的demo在GitHub上狼渊。有感興趣的小伙伴可以一起探索,討論类垦。
最后貼兩張全部代碼圖片