基本上所有 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 的宽高值。

所以,ActivityonAttachedToWindow() 回调之后,布局中的 View 会回调 onAttachedToWindow() ,然后才会去进行测量和绘制等。那么我们要获取一个 View 的宽高就最好是 View.post() 了。

View 的 onAttachedToWindow 使用场景

ViewonAttachedToWindow() 的调用时机会发生在 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

说到 AdapteronViewAttachedToWindow,咋发现这里面竟然还有一个 onAttachedToRecyclerView 方法,根据源码我们可以发现,onAttachedToRecyclerView() 是在 setAdapter() 的时候触发。

对比一下,我们便能得出以下它们的使用场景:

  1. RecyclerView 本质上也是一个 ViewGroup,那么它的 Item 要显示出来,自然需要 addView() 进来,移出的时候,当然也要 removeView() 出去,所以对应的自然是 onViewAttachedToWindow()onViewAttachedToWindow() 了。所以在一定场景下,可以通过这两个回调来处理一些 Item 移出屏幕,移进屏幕锁需要的工作。为什么说一定场景下呢,因为如果调用了 notifyDataSetChanged() 方法的话,会触发当前在屏幕中的所有 Item 的 onViewAttachedToWindow()
  2. onAttachedToRecyclerViewonAttachedToRecyclerView() 的话,就更加适合做一些资源回收的工作啦。

我的 RecyclerView.Adapter 的 onViewAttachedToWindow 为啥没起作用?

可能会有小伙伴会遇到这个问题,在遇到这个问题前,先检查一下你这个 RecyclerView 是否是一个正常滚动的 View,你如果是被别人嵌套滚动,把自己设置了 isNestedScrollingEnabled 为 false 的话,那你都失去了 Recyclerview 的功用了,那自然是不行的。

可能又有小伙伴说了,由于需求历史原因,我就是用了 NestedScrollView 嵌套了 Recyclerview,并禁掉了 Recyclerview 的滑动功能,但又想做上面的曝光埋点功能,那如何是好?

如果是这样的话,大概你就只能通过类似 ViewgetGlobalVisibleRect() 这样的方法来判断 View 的可见性来处理了。关于 View 的可见性分析,这里就点到为止,大家就自行 Google 吧。

每日一问:浅谈 onAttachedToWindow 和 onDetachedFromWindow的更多相关文章

  1. 浅谈REST API

    浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项 ...

  2. 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...

  3. 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

    心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...

  4. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  5. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  6. 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真

    浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...

  7. 《浅谈磁盘控制器驱动》,磁盘控制器驱动答疑解惑![2012.1.29完结]by skyfree

    <浅谈磁盘控制器驱动>,磁盘控制器驱动答疑解惑![2012.1.29完结]  https://www.itiankong.net/thread-178655-1-1.html Skyfre ...

  8. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  9. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

随机推荐

  1. 获取web.config配置文件的sectionGroup

    1)web.config 文件内容如下: <configuration> <configSections> <sectionGroup name="KaiXin ...

  2. 自定义adapter 的getView方法被重复执行了n次的解决方法

    1. getView执行的次数和你的getCount没有直接的关系   ,getCount和你listView里面的条目数量(行数量)有关系 ,getView方法执行次数取决于你屏幕上显示几个条目,比 ...

  3. 追本溯源 —— 句型、表达、模式,pattern,著名的话

    ** 时候,做了 ** 事,是我 **,做得最对的一件事: "Winning that ticket was the best thing that ever happened to me& ...

  4. 解析Android的 消息传递机制Handler

    1. 什么是Handler: Handler 网络释义"机械手.经理"意思,在Android它用于管理多个线程UI操作: 2. 为什么会出现Handler: 在Android里面的 ...

  5. C# 用XiliumCefGlue做浏览器,JS和C#相互调用

    原文:C# 用XiliumCefGlue做浏览器,JS和C#相互调用 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013564470/artic ...

  6. 使用Photoshop切图的三种方式

    PhotoShop切图的三种方式 1. 原始切图 (1)选择工具栏中的切片工具 (2)找到要切片的元素,在右侧的图层框中,使元素背景隐藏,然后用切片工具选择需要切片的元素     (3)导出为web常 ...

  7. [Gevent]gevent 网络抓取问答

    我听说过gevent基于事件的异步处理功能 如何高效率,该项目已很少使用,今天是没什么学习一些简单的使用. 有正式书面一个非常好的教程 中国版的地址:http://xlambda.com/gevent ...

  8. WPF学习笔记:(二)数据绑定模式与INotifyPropertyChanged接口

    数据绑定模式共有四种:OneTime.OneWay.OneWayToSource和TwoWay,默认是TwoWay.一般来说,完成数据绑定要有三个要点:目标属性是依赖属性.绑定设置和实现了INotif ...

  9. css3如何让div一直循环自转圈,附带:网络请求通知图片一直在转圈实例

    css3如何让div一直循环自转圈 代码如下: div{ -webkit-transition-property: -webkit-transform; -webkit-transition-dura ...

  10. 原生Js监听普通dom尺寸变化

    原生Js监听普通dom尺寸变化 具体做法有以下几种: 初始化项目后,轮询,反复查看 dom 尺寸是否变化,这种一听就感觉不好,开销太大. 监听元素的滚动事件,在 目标 dom 里面包裹一个同等大小的 ...