Android View 监听宿主生命周期

一、说明

今天遇到一个需求:

在自定义 View 中会有一个 Timer 定时任务执行更新 UI 操作,希望当页面退出时将定时任务停掉,否则可能由于定时任务无法释放导致内存泄露。

可能有人会建议将在 Activity 的 onDestroy 中停掉定时任务,但这种方式是比较难以维护的,你需要要求每一个用你的自定义 View 的技术人员都记得去释放一下,这不太现实,最好的方式是你的自定义 View 可以自己监听生命周期并进行释放。

二、解决方案

方案 1:将生命周期传入

将 Activity 的所有生命周期传入 View,是最直接也是最笨的一个方法,不到万不得已最好不要这样搞,否则很难维护。

方案 2:用 View 自带的生命周期

android view有以下14个周期:

  1. onFinishInflate() 当View中所有的子控件均被映射成xml后触发 。
  2. onMeasure( int , int ) 确定所有子元素的大小 。
  3. onLayout( boolean , int , int , int , int ) 当View分配所有的子元素的大小和位置时触发 。
  4. onSizeChanged( int , int , int , int ) 当view的大小发生变化时触发 。
  5. onDraw(Canvas) view渲染内容的细节。 
  6. onKeyDown( int , KeyEvent) 有按键按下后触发 。
  7. onKeyUp( int , KeyEvent) 有按键按下后弹起时触发 。
  8. onTrackballEvent(MotionEvent) 轨迹球事件 。 
  9. onTouchEvent(MotionEvent) 触屏事件 。
  10. onFocusChanged( boolean , int , Rect) 当View获取或失去焦点时触发 。
  11. onWindowFocusChanged( boolean ) 当窗口包含的view获取或失去焦点时触发 。
  12. onAttachedToWindow() 当view被附着到一个窗口时触发 。
  13. onDetachedFromWindow() 当view离开附着的窗口时触发,对应 onAttachedToWindow()。 
  14. onWindowVisibilityChanged( int ) 当窗口中包含的可见的view发生变化时触发。

比如我想监听退出页面时停止任务,就可以把逻辑写在 onDetachedFromWindow 方法中。

方案 3:为 Activity 添加一个空白自定义 Fragment

这个方案借鉴 Glide 监听生命周期的原理,它会为 Activity 添加一个空白的自定义 Fragment,并在其中监听宿主的生命周期。

具体实现请参考:Glide源码分析3 -- 绑定Activity生命周期

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值