【Android开发小技巧】扔掉这坑人的 Handler

简介: 大家都知道 Handler 特别坑,使用不当会造成各种问题,使用 Kotlin Coroutines + Lifecycle 可以很好地替代 Handler。

1. 坑人的 Handler

大家都知道 Handler 特别坑,使用不当会造成各种问题:

  • Activity 中使用 Handler 有可能会造成 Context 内存泄漏;
  • Handler() 默认构造函数会因为缺少 Looper 而崩溃(虽然已标位 deprecated ) ;
  • View.post/postDelayed 基于 Handler 实现,在 View 已经 detached 时可能仍在执行,造成异常

诸如上述这些问题让开发者们防不胜防,但是 Handler 便利性又让开发者们难以割舍。大家希望寻找一种同样方便但更安全的替代方案。如今借助 Kotlin Coroutine + Lifecycle 我们可以做到这一切,思路很简单:利用协程执行异步任务,同时绑定 Lifecycle ,在必要的时候终止任务

2. 替代 Handler.post/postDelayed

项目中添加 coroutie 和 lifecycle 依赖:

implementation "andoridx.lifecycle:lifecycle-runtime-ktx:2.3.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"

代码如下

fun LifecycleOwner.postDelayedOnLifecycle(
    duration: Long,
    dispatcher: CoroutineDispatcher = Dispatchers.Main,
    block: () -> Unit
): Job = lifecycleScope.launch(dispatcher) {
    delay(duration)
    block()

}

因为 Handler.post 运行在 UI 线程, 所以 Dispatcher 默认使用 Dispatchers.MainpostDelayed 的延时使用 delay 实现。

使用效果如下,在 Activity 或 Fragment 中无需再依赖 Handler 了

class MainActivity : AppCompatActivity() {
  
    ...
    postDelayedOnLifecycle(500L) {
      //Do something
    }
    ...

}

3. 替代 View.post/postDelayed

我们还可以借助 lifecycle-ktx 提供的 View 的扩展方法 findViewTreeLifecycleOwner(),替代 View.post / View.postDelayed , findViewTreeLifecycleOwner 可以从当前 View 最近的 Fragment 或者 Activity 获取 LifecycleOwner。

代码如下:

fun View.postDelayedOnLifecycle(
    duration: Long,
    dispatcher: CoroutineDispatcher = Dispatchers.Main,
    block:() -> Unit
) : Job? = findViewTreeLifecycleOwner()?.let { lifecycleOwner ->
    lifecycleOwner.lifecycleScope.launch(dispatcher) {
        delay(duration)
        block()
    }
}

所以, Handler 是不是可以彻底 Deprecated 了 ?

目录
相关文章
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
245 1
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
213 0
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
226 2
|
8月前
|
消息中间件 Android开发
Android Handler的使用方式以及其机制的简单介绍
Handler 是 Android 中实现线程间通信的重要机制,可传递任意两线程数据。常用场景包括子线程向主线程(UI 线程)传递结果,以及主线程向子线程发送消息。其核心涉及四个类:Handler(发送/接收消息)、Message(消息载体)、MessageQueue(消息队列)和 Looper(消息循环泵)。基本流程为:Handler 发送 Message 至 MessageQueue,Looper 从队列中按 FIFO 取出并处理。
261 0
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
242 1
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
476 2
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文章通过一些问答的模式结合Android主线程(UI线程)的工作原理来讲解,源码注释很全,还有结合流程图,如果你对Android 消息处理机制还不是很理解,我相信只要你静下心来耐心的看,肯定会有不少的收获的。
942 3
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
Android开发
Android面试常客之Handler全解1
Android面试常客之Handler全解
|
Android开发
38. 【Android教程】Handler 消息传递机制
38. 【Android教程】Handler 消息传递机制
418 2

热门文章

最新文章