每日一问:浅谈 onAttachedToWindow 和 onDetachedFromWindow
基本上所有 Android 开发都会接触到 onCreate()
、onDestory()
、onStart()
、onStop()
等这些生命周期方法,但却不是所有人都会去关注到 onAttachXXX()
这样的方法群体,今天,笔者就希望用简短的文章对此进行一定讲解。
Activity 中的 onAttachedToWindow
首先在 Activity
中我们可以重写 onAttachedToWindow()
和 onDetachedFromWindow()
这一对方法。顾名思义,"Attached" 就是附加的意思,所以我们可以确定 onAttachedToWindow()
就是在 View
附加到 window
上的时候进行回调,而 onDetachedFromWindow()
就刚好相反。
这一对方法会在我们熟悉的 Activity
生命周期的 onResume()
和 onPause()
中间,但并不是每一次 onResume()
和 onPause()
回调的时候都会在接下来回调它们。应该比较好理解,我们当然不需要频繁往 window
中附加和分离 View
嘛。
这里自然我们容易产生一个问题,在 onAttachedToWindow()
回调的时候,我们能拿到 View
的宽高么?换句话说就是这时候 View
是否已经经过了测量和绘制呢?
我们编写一个 Demo 进行日志打印看看。
可以看到,并没有。我们只有在 onWindowFocusChanged
回调的时候才能真正的拿到 View
的宽高值。
所以,在 Activity
的 onAttachedToWindow()
回调之后,布局中的 View
会回调 onAttachedToWindow()
,然后才会去进行测量和绘制等。那么我们要获取一个 View
的宽高就最好是 View.post()
了。
View 的 onAttachedToWindow 使用场景
View
的 onAttachedToWindow()
的调用时机会发生在 onMeasure()
之前,那么它们到底有什么使用场景呢?
我们在自定义 View 的时候,某些比较重量级的资源,而且不能与其他 View
通用的时候,就可以重写这两个方法,并在 onAttachedToWindow()
中进行初始化,onDetachedFromWindow()
方法里释放掉。
比如 Bitmap
,虽说现在不用主动调用 recycle()
方法来回收,但在 8.0 及以上系统,手动调用是会立即释放所占用的内存的,所以个人认为还是有必要手动回收的,当然了,如果图片比较小,对内存没什么影响的就不用了。
再比如一些用作计算的子线程,或其他跟 View
显示有关的任务,在 onDetachedFromWindow()
中也可以停掉了,因为大多数情况下,这些实时数据对于被分离后 View
已经没有意义了。
RecyclerView.Adapter 的 onViewAttachedToWindow
细心的小伙伴会发现,在 RecyclerView.Adapter
中也会有这么一个 onViewAttachedToWindow()
和 onViewAttachedToWindow()
。
这两个方法在列表布局的时候,用作曝光埋点非常好用,当 Adapter
创建的 View
被窗口分离(即滑动离开了当前窗口界面的)的时候,onViewAttachedToWindow()
会被直接回调,反之,在列表项 View
在被滑动进屏幕的时候,onViewAttachedToWindow()
会立马被调用。
有了这样的属性,对于我们的曝光埋点,就手到擒来了,直接在里面做就完事儿了。
RecyclerView.Adapter 咋还有一个 onAttachedToRecyclerView
说到 Adapter
的 onViewAttachedToWindow
,咋发现这里面竟然还有一个 onAttachedToRecyclerView
方法,根据源码我们可以发现,onAttachedToRecyclerView()
是在 setAdapter()
的时候触发。
对比一下,我们便能得出以下它们的使用场景:
RecyclerView
本质上也是一个ViewGroup
,那么它的Item
要显示出来,自然需要addView()
进来,移出的时候,当然也要removeView()
出去,所以对应的自然是onViewAttachedToWindow()
和onViewAttachedToWindow()
了。所以在一定场景下,可以通过这两个回调来处理一些 Item 移出屏幕,移进屏幕锁需要的工作。为什么说一定场景下呢,因为如果调用了notifyDataSetChanged()
方法的话,会触发当前在屏幕中的所有 Item 的onViewAttachedToWindow()
。- 而
onAttachedToRecyclerView
和onAttachedToRecyclerView()
的话,就更加适合做一些资源回收的工作啦。
我的 RecyclerView.Adapter 的 onViewAttachedToWindow 为啥没起作用?
可能会有小伙伴会遇到这个问题,在遇到这个问题前,先检查一下你这个 RecyclerView
是否是一个正常滚动的 View
,你如果是被别人嵌套滚动,把自己设置了 isNestedScrollingEnabled
为 false 的话,那你都失去了 Recyclerview
的功用了,那自然是不行的。
可能又有小伙伴说了,由于需求历史原因,我就是用了 NestedScrollView
嵌套了 Recyclerview
,并禁掉了 Recyclerview
的滑动功能,但又想做上面的曝光埋点功能,那如何是好?
如果是这样的话,大概你就只能通过类似 View
的 getGlobalVisibleRect()
这样的方法来判断 View
的可见性来处理了。关于 View
的可见性分析,这里就点到为止,大家就自行 Google 吧。
每日一问:浅谈 onAttachedToWindow 和 onDetachedFromWindow的更多相关文章
- 浅谈REST API
浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项 ...
- 浅谈Android编码规范及命名规范
前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...
- 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route
心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- 浅谈php生成静态页面
一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...
- 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真
浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...
- 《浅谈磁盘控制器驱动》,磁盘控制器驱动答疑解惑![2012.1.29完结]by skyfree
<浅谈磁盘控制器驱动>,磁盘控制器驱动答疑解惑![2012.1.29完结] https://www.itiankong.net/thread-178655-1-1.html Skyfre ...
- 【架构】浅谈web网站架构演变过程
浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管 ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
随机推荐
- Android Handler、Message完全解析,带你从源码的角度彻底理解
之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 ...
- 如何提高自己的java开发功底
1.拥有扎实的基础和深刻理解OO原则 对于Java程序员,深刻理解Object Oriented Programming(面向对象编程)这一概念是必须的.没有OOPS的坚实基础,就领会不了像Java这 ...
- 机器学习编程接口(api)设计(oop 设计)
fit: 对于 kmeans 来说,fit 的过程,就是训练,自然所需的参数,主要是数据集和聚类中心数, 1. classification(分类) def train(train_images, t ...
- Like关系查询
比如:有表1.表2两张相,希望通过like进行关联查询 // mysql中使用concat连接字符串 select t1.id, t1.title, t2.keyword from t1 inner ...
- Mybatis动态建表
在网上查了很多,都说Mybatis不支持动态建表,心凉了一节.还好找到这么一篇,找到了希望:http://www.zzzyk.com/show/ec5660d9cf1071b3.htm 经过在mysq ...
- OpenGL(五) 三维变换之模型视图矩阵
计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动.通常情况下,物体位置的变化包含三个基本的变化:平移.旋转和缩放,物体的运动也可以用这三个基本的运动 ...
- Andrdoid适当的执行行为拦截的应用----从底部C截距
前一个概要文章称这项研究我的一些主要细节.这里就不在说.但还需要指出的是.关于三大感谢上帝愿意分享知识(在我看来,人们懂得分享和慎重考虑之神,奥地利不一定是技术牛~~) 第一篇:http://blog ...
- crossplatform---Nodejs in Visual Studio Code 03.学习Express
1.开始 下载源码:https://github.com/sayar/NodeMVA Express组件:npm install express -g(全局安装) 2.ExpressRest 打开目录 ...
- 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
1.index.wxml <!--index.wxml--> <button style="margin:30rpx;" bindtap="choose ...
- MySQL 日期时间 专题
1.1 获得当前日期+时间(date + time)函数:now() 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() curr ...