一个关于List的IndexOutOfBoundsException异常记录 下面的代码是一个关于List的经典问题,平常工作中,我们对空指针会比较警惕,稍不留意可能就会写出来下面的问题代码。... "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 main at java.util.ArrayList.rangeCheck...429) at com.lingyejun.dating.chap11.thread.MyDemo3.main(MyDemo3.java:17) 根本原因在于new ArrayList()的时候创建出来的是一个不包含任何内容的空数组...,此时的数组size是0,然后list.get(0)操作时,index>=size,所以就出现了数组越界的异常,在这里小记一下。...elementData(index); } private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException
要做的,应该是分析该错误出现的原因,尽量避免这类问题的出现。 关于 Exception 和 Error 的区别,可以简单这么理解,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。...看了该讲作者所扩展的点,以及评论区里大神的回复,其实还可以从常见的一些异常,即原因和处理方式扩展;也可以从异常处理代码的规范角度出发扩展讲一讲,我都统一将这些扩展都在开头的提问中列出来了。...IndexOutOfBoundsException 数组越界异常,这类异常还蛮经常出现的,避免方式就只能是尽量书写规范的代码,注意一些,或者多让程序跑跑 Lint 检查。...NullPointerException 空指针异常,这异常算是最令人头疼的异常了,在线上异常的比例中,肯定不少。...函数的返回值有两种类型:值类型和对象引用,对于对象引用,要特别小心,如果在 finally 代码块中对函数返回的对象成员属性进行了修改,即使不在 finally 块中显示调用 return 语句,这个修改也会作用于返回值上
mWindow = new PhoneWindow(this, window, activityConfigCallback);所以我们直接看PhoneWindow源码中的setContentView...2.这里的root就是decorView,root.addview(),实际是root的父类frameLayout的父类viewGroup来具体实现。...等到OnResume阶段后,会走到ActivityThread的handleResumeActivity方法中,调用makeVisible方法 void makeVisible() { //1....完成的。...方法,接下来就是 measure、layout、draw这三大流程就不详细讲,这三个流程中会把childView数组中每个子view遍历放在DecorView中,呈现出屏幕上。
1.Window是什么 Window在Android开发中是一个窗口的概念,它是一个抽象类,具体的实现类是PhoneWindow,在PhoneWindow中有一个顶级View—DecorView,继承自...但是Window并不是真实存在的,它更多的表示一种抽象的功能集合,View才是Android中的视图呈现形式,绘制到屏幕上的是View不是Window,但是View不能单独存在,它必需依附在Window...这个抽象的概念上面,Android中需要依赖Window提供视图的有Activity,Dialog,Toast,PopupWindow,StatusBarWindow(系统状态栏),输入法窗口等,因此Activity...(WindowManagerGlobal) 3.WindowManagerGlobal 先介绍几个重要的数据结构 private static IWindowManager sWindowManagerService...,作为WindowManagerGlobal中大部分的内部实现 private final ArrayList mParams = new
该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!...在前面的文章中我也很少贴出源码。本系列文章意在让读者对Android系统有个更整体的把握。我所写的每一章知识都有可能在实际工作中用到。...可以看出WindowManagerGlobal是个典型的单例。 WindowManagerGlobal 的addView方法并不复杂,其主要的关键点我们已经标注并写了注释。...WindowManagerGlobal是个单例类,它在进程中只存在一个实例,是它内部的addView方法最终创建了我们的核心类ViewRootImpl。...它是WindowManagerGlobal的实际工作者。 ---- 下篇预告 在下一篇文章中我们将深入介绍ViewRootImpl的工作流程。测量、布局、以及绘制。 ---- 此致,敬礼
第一篇:《Window源码解析(一):与DecorView的那些事》 Header 在上一篇中,我们讲了 Window 和 DecorView 的那些事,如果没有看过的同学请点击这里:《Window源码解析...而今天就要来详细了解 Window 的添加机制了,到底在 WindowManager.addView 中做了什么事情?我们一起来看看吧!!...若不是 WindowManagerGlobal.ADD_OKAY 则说明添加失败了,抛出对应的异常。...()); ... // 返回添加窗口的结果 return res; } 在 WindowManagerService 中做的事情有很多,一开始利用...再然后就是创建了一个 WindowState 对象,利用这个对象按照显示次序插入 mWindows 列表中,最后就是依据排序来确定窗口的最终显示次序。并返回了 Window 添加的结果 res 。
image.png 目录 Android之WindowManager介绍 WindowManager android中真正展示给用户的是window和view. activity在android中所其的作用主要是处理一些逻辑问题...在android中,窗口的管理还是比较重要的一块,因为他直接负责把内容展示给用户,并和用户进行交互。响应用户的输入等。...View才是Window存在的实体,在实际使用中无法直接访问Window,对Window的访问必须通过WindowManager。...,不过具体的实现细节还是WindowManagerGlobal这个类来做的,这个类是一个单例模式。...在 WindowManagerGlobal 中实现方法中,都可以见到 ViewRootImpl,也就说 WindowManagerGlobal 方法最后还是调用到了 ViewRootImpl。
mGlobal = WindowManagerGlobal.getInstance(); WindowManagerGlobal 的addView方法为 public void addView...,并将DecorView,ViewRootImpl,LayoutParams 添加到集合中管理起来,最后调用 root.setView(view, wparams, panelParentView);...这也就是为什么View再用requestLayout方法的时候最终会走到ViewRootImpl的requestLayout 总结:首先ActivityThread中的performLaunchActivity...方法,实际上使用的是PhoneWindow的setContentView,其中先会选择DecorView的基本布局并创建DecorView,然后使用LayoutInflater进行一个深度优先遍历将我们传入的...xml解析成具体View并添加到DecorView的一个FrameLayout中 最终ActivityThread会调用handleResumeActivity方法,通过WindowManagerGlobal
Window 添加过程 WindowManagerImpl内部调用了WindowManagerGlobal的addView方法,采用了懒汉式线程安全的方法进行初始化WindowManagerGlobal...WindowManagerGlobal的updateViewLayout方法。...Window 删除过程 Window删除过程调用的是WindowManagerGlobal的removeView方法。...方法; View的dispatchDetachedFromWindow方法,内部会调用onDetachedFromWindow方法,方法中可以进行资源回收,比如停止动画,与线程操作; 最后调用WindowManagerGlobal...的doRemoveView将之前的mRoots,mParams,mDyingView中的Window关联的ViewRootImpl对象移除 void doRemoveView(ViewRootImpl
1 先看结论 Window是一个抽象类,具体的实现是PhoneWindow; android系统中,每个界面,对应着一个Window;但其实在android系统中Window也是一个抽象的概念...赋值, // 事实上, Window中 并未使用传递进去的windowManager, 而是在此方法中 调用WindowManagerImpl.createLocalWindowManager 重新创建了一个...注册的地方(在6.0中 注册的代码 已经提取到android.app.SystemServiceRegistry#registerService中了)。...root.setView(view, wparams, panelParentView); ... } 在WindowManagerGlobal中,会为每一个Window创建对应的...而client端的获取,就是同 WindowManagerGlobal.initialize()进行,连通WMS的服务端; mWindowSession.addToDisplay最终调用的会是
WindowManagerImpl的removeView方法,removeView方法中又会调用WindowManagerGlobal的removeView方法,我们就从这里开始讲起。...为了表述的更易于理解,本文将要删除的Window(View)简称为V。WindowManagerGlobal的removeView方法如下所示。...注释7处的WindowManagerGlobal的doRemoveView方法,如下所示。...中维护了和 Window操作相关的三个列表,doRemoveView方法会从这三个列表中清除V对应的元素。...注释1处找到V对应的ViewRootImpl在ViewRootImpl列表中的索引,接着根据这个索引从ViewRootImpl列表、布局参数列表和View列表中删除与V对应的元素。
performTraversals 方法中 , 完成 测量 , 布局 , 绘画 操作 ; 在 WindowManagerGlobal 中的 addView 方法的主要作用是添加 DecorView ;...= WindowManagerGlobal.getWindowSession() 获得 ; WindowManagerGlobal 的 getWindowSession 方法中 , 最终 WindowSession...的 getWindowSession 获取 , 最终还是调用了 WindowManagerService 的 openSession 方法 ; WindowManagerGlobal 参考源码 : public...在 WindowManagerService 的 addWindow 方法中 , 初始化了 窗口的状态 WindowState , 通过调用 WindowState 的 openInputChannel...方法 , 设置了 InputChannel , 就是将 ViewRootImpl 中 setView 方法中 new InputChannel() 创建的 InputChannel 传递进来 ; WindowManagerService
我们发现 ViewRootImpl 的构造器权限是 public 的,所以不存在单例调用。 一番查找在 WindowManagerGlobal 的 addView 中找到了如下代码。...WindowManagerGlobal 提供与系统窗口管理器的低级别通信,用于与任何特定上下文无关的操作。...ViewRootImpl 与 WindowManagerService 通讯分析 WindowManagerImpl 作为 WindowManagerGlobal的代理持有了WindowManagerGlobal...而WindowManagerService又有着对 Window 的最终实现,于是乎我们重新回到 ViewRootImpl 中找到 setView中的代码片段。...,Session中也持有了WindowManagerService的实例。
具体的实现在ContextImpl中,如下所示。...的实现类,但是却没有实现什么功能,而是将功能实现委托给了WindowManagerGlobal,这里用到的是桥接模式。...关于在Window中添加View,本系列后续的文章会详细介绍。...我们来查看WindowManagerImpl中如何定义的WindowManagerGlobal: frameworks/base/core/java/android/view/WindowManagerImpl...可以看出WindowManagerGlobal是一个单例,说明在一个进程中只有一个WindowManagerGlobal实例。
Window中的View。...,我们会发现它并未实现3大方法,而是交给WindowManagerGlobal来实现,WindowManagerGlobal以工厂的型式对外提供自己的实例 public static WindowManagerGlobal...Window的删除过程 WindowManagerImpl的工作模式是典型的桥接模式,所有操作全部委托WindowManagerGlobal来实现,所以还是看WindowManagerGlobal...DecorView中了 2)将View 添加到DecorView的mContentParent中 回到PhoneWindow的setContentView方法中的mContentParent.addView...添加到Window中,在ActivityThread的handleResumeActivity方法中,会调用Activity的onResume方法,然后调用Activity的makeVisible方法,
removeViewLocked(index, immediate); // 如果要删除的 view 不是 viewrootimpl 中的 view ,...大多数的默认情况下,immediate 都为 false 。 之后又将 view 添加到 mDyingViews 中。mDyingViews 维持着都是即将要删除的 View 。...mRoots mParams mDyingViews 中移除该 view 的引用 WindowManagerGlobal.getInstance().doRemoveView(this)...; } doDie() 方法中主要看两点: dispatchDetachedFromWindow() 是去执行删除 window 的方法; WindowManagerGlobal.getInstance...().doRemoveView(this) 把 mRoot 、mParams 和 mDyingViews 中关于当前 Window 的参数都移除了。
来进行跨进程通信,WMS作为系统服务有很多API是不会暴露给WindowManager的 3.Window是以View的形式存在的 4.PhoneWindow是在Activity启动过程中的attach...方法中创建的 5.WindowManagerImpl虽然是WindowManger的实现类,但是没有实现什么功能,而是将功能实现委托给了WindowManagerGlobal,这里用到的是桥接模式 6....WindowManager继承自接口ViewManager,WindowManagerImpl是WindowManager接口的实现类,但是具体的功能都会委托给WindowManagerGlobal来实现...,此前的代码逻辑都是运行在本地进程的,而Session的addToDisplay方法则运行在WMS所在的进程(SystemServer进程)中 ?...方法,updateViewLayout方法在WindowManagerImpl中实现,然后会调用WindowManagerGlobal的updateViewLayout方法 --摘自《Android进阶解密
ViewRootImpl 的创建过程是从 WindowManagerImpl 中开始的。View 的测量,布局,绘制以及上屏,都是从 ViewRootImpl 中开始的。...WindowManagerImpl WindowManager 的实现类,WindowManagerImpl 中的内部方法实现都是通过代理类 WindowManagerGlobal 来完成。...WindowManagerGlobal WindowManagerGlobal 是一个单例,也就是说一个进程中只有一个 WindowManagerGlobal对象,他服务与所有页面的 View。...setContentView 方法中的 View 最终也会被添加到 Window 对象中的 DecorView 中,也就是说一个 Window 中对应着一个 View。...例如 Activity 中,在 onresume 执行完成后,就会获取 Window 中的 DecorView,然后通过 WindowManager 把 DecorView 添加到窗口上,这个过程中是由
因为 你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。... ,这个已经理解了,这个实例一般是作为成员变量存在于代理类中的,它有个特点就是不需要你赋值,直接调用全局变量,或者构造函数里面不需要传递这个参数进去,它可以直接new的这种特性,一般都是属于代理模式...android中的具体应用:WindowManagerImpl就是一个代理类 public final class WindowManagerImpl implements WindowManager... { //WindowManagerGlobal就是被代理的对象, private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance...,其实我们实际代码中很多方法都是使用了代理模式, 它的优点就是:持有代理对象,我只关心我需要的方法,很多方法用户并不知道,没有暴露出来。
JS中的phototype 原型法设计模式 ? JS中的phototype.png 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。...javascript中的每个对象都有prototype属性 prototype属性:返回对象类型原型的引用 prototype就是“一个给类的对象添加方法的方法”,使用prototype属性,可以给类动态地添加方法...javascript的方法可以分为三类 a 类方法 People.sleep = function(){console.log('I Am Sleeping ...')}