GlobalScope.launch(Dispatchers.IO){ }.lifeRecycle(lifecycle) <<<<在这里 复制代码
lifecycle
。lifecycle.addObserver(LifecycleObserver) 复制代码
lifecycle.addObserver(object : LifecycleEventObserver { override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { if (event == Lifecycle.Event.ON_DESTROY) { //activity destroy } } }) 复制代码
cancel
函数。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) <<<<在这里 } 复制代码
Job
,Deferred<T>
,CoroutineScope
Job
就是使用launch
函数的时候的返回值它持有cancel
函数
Deferred<T>
继承自Job
public interface Deferred<out T> : Job { //... } 复制代码
CoroutineScope
是协程执行范围可在执行期间cancel
自己这个cancel
是CoroutineScope
的扩展函数
public fun CoroutineScope.cancel(cause: CancellationException? = null) { //。。。。。。 } 复制代码
而我们通用的几个协程函数取消的控制也就这几个可以控制,所以我找到了给谁扩展。
Job
扩展一个fun Job.lifeRecycle(lifecycle: Lifecycle): Job { return this } 复制代码
就是这么简单,但为什么要return
回去呢,为了不破坏原代码的结构。减少异常的处理。
我们要使用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 } 复制代码
看是不是很简单!
最后贴两张全部代码图片