谁还在用传统Handler执行延时任务啊?还不试试协程?

118 阅读1分钟

利用协程对postDelayed进行改造

  • 在Android开发中不可避免的会遇到延迟执行的一些场景,通常的用法是

new Handler(Looper.getMainLooper()).postDelayed(runnable, delay);

但是这样会存在当fragment、activity销毁后,延迟任务仍然执行的问题,所以需要对postDelayed进行改造。

首先利用Kotlin 的拓展函数,对fragment、activity进行扩展.

inline fun BaseActivity.postDelayedSafe(delayed: Int, crossinline f: suspend () -> Unit) { (this as LifecycleOwner).lifecycleScope.launch(Dispatchers.Main) { delay(delayed.toLong()) f() } }

然后将原有的postDelayed方法改为对postDelayedSafe 的调用

这样利用Kotlin携程job支持取消的特性,对postDelayed进行改造,当fragment、activity销毁后,延迟任务不再执行避免了空指针和内存泄漏问题。