1.viewstub就是动态加载试图;也就是在我们的app启动绘制页面的时候,他不会绘制到view树中;当在代码中执行inflate操作后,她才会被添加到试图中。...layout所引用的那个布局;parent就是getParent方法得到的,也就是acticity的填充布局LinearLayout; 进去看一下: private void replaceSelfWithView...;parent.addView()就是把view(也就是我们引用的布局)添加到了父布局LinearLayout中。...; 而使用textView = findViewById(R.id.hello_tv);就可以直接拿到控件对象了; 当实现引用布局的显示和隐藏时,测试发现使用viewstub的setVisibility...,使用viewstub可以实现相同的显示或隐藏效果; 从上图的最后一个红色框中可以发现,假设现在我没有调用inflate方法,而是直接点击了show按钮;然后引用布局也可以绘制出来;这就是我在写demo
我们写出了并不太理想的代码,这都是可以接受的,只要你会去持续优化,这些问题都会得到改善。而有些人是心有余而力不足,“我也想优化,可是怎么去优化呢?”。...所以Android推出了基于AOT(Ahead Of Time)的ART。它是在应用被安装的时候提前将.dex文件翻译成机器码放入手机中,当程序被执行的时候无需在实时的翻译,而是直接执行。...所以Dalvik在Mark阶段又分解成下面的小阶段: ①(此阶段不允许其它线程工作):标记根集对象,所谓根集指的是被全局变量、栈变量和寄存器等引用的对象 ②(此阶段允许其它线程正常工作): a、标记被根集对象引用的对象...为什么需要两个对象来标记呢?...c.静态集合要置空 集合会引用存储的对象,静态的集合生命周期与应用一样,导致存储的对象的内存无法释放,所以在不用的时候一定要将集合置空。
一种是在类被加载的时候就完成单例对象的初始化,一种是在需要使用该单例的时候才初始化。 在android的视图设计中,同样需要使用的这样的设计模式。 这样的视图加载起来需要耗费很多的时间。...下面看看加载视图前后的对比图: 为了说明视图树在加载前后的对比,我使用hierarchyviewer视图树查看工具,做了一个前后对比图: 加载前视图树: 加载后视图树: 从上面的两个视图树中我们明显发现...(到此,ViewStub从视图树种移除) parent.removeViewInLayout(this); // 得到ViewStub在布局文件中定义的...= null) { // 如果对待加载视图的软引用不为空,说明已经执行过inflate方法了 // 因为在inflate方法执行成功后有对其赋值 View...} else { // 如果引用的视图已经被垃圾回收器回收,则抛出异常 // 这也就是为什么setVisibility可以调用多次,但是并不推荐这样做的原因
双重检查单例,为什么要加 volatile? 1.volatile想要解决的问题是,在另一个线程中想要使用instance,发现instance!...分代收集 GC 方法会吧堆划分为新生代、老年代 新生代:新建小对象会进入新生代;通过复制算法回收对象 老年代:新建大对象及老对象会进入老年代;通过标记-清除算法回收对象 2.方法区中的类信息、常量池...判断一个对象是否可被回收: 1.引用计数法 缺点:循环引用 2.可达性分析法 定义:从 GC ROOT 开始搜索,不可达的对象都是可以被回收的 GC ROOT 1.虚拟机栈/本地方法栈中引用的对象...2.方法区中常量/静态变量引用的对象 四种引用 强引用:不会被回收 软引用:内存不足时会被回收 弱引用:gc 时会被回收 虚引用:无法通过虚引用得到对象,可以监听对象的回收 ClassLoader 类的生命周期...知己知彼、百战不殆,无论学习还是面试也是如此,针对于上面的的知识点我总结出了互联网公司Android程序员在面试中涉及到的绝大部分架构面试题及答案做成了文档和架构视频资料免费分享给大家(包括APP开发框架知识
声明变量为可空后,在运行时便不会抛出异常。 类型智能转换:通过is进行类型判断后,编译器自动进行类型转换。父类引用可以调用子类接口,注意转换只在is的代码块中生效。...[1.png] Kotlin为什么可以兼容Java,一个主要原因是Kotlin文件在经过Kotlin编译器编译后会生成Java字节码。...[16.png] ----- 二、新特性 1、空安全 Kotlin是如何实现空安全的呢? 在Kotlin中,对象声明分为可空引用和非空引用两种。...非空引用: [17.png] 可空引用: [18.png] 安全调用操作符,写作 ?. 可空调用: [19.png] 通过函数调用给可空引用赋值,返回的必须也是可空引用。...这就在编译期间杜绝了空指针异常。但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。
理论上可以在一个进程中拥有多个JavaVM对象,但Android只允许存在一个。 JNIEnv提供了大部分JNI功能。使用者定义的所有Native函数都会接收JNIEnv作为第一个参数。...相同对象的引用却可能具有不同的值。例如,用相同对象连续地调用NewGlobalRef得到返回值可能是不同的。为了检查两个引用是否指向的是同一个对象,使用者必须使用IsSameObject函数。...在连续的调用过程中两个不同的对象却可能拥有相同的32位值。不要使用jobject的值作为key. 使用者需要“不过度分配”局部引用。...对于Android app,会发现从context对象中得到应用私有数据存储的全路径是非常有用的。 上面是推荐的方式,但不是仅有的实现方式。...它们的支持是直接构建到JNI中的,在未来的版本中性能可能会得到提升。
只有强可达的对象才会认为是存活的对象,才能保证在垃圾收集的过程中不会被回收; 维度 2 - 垃圾回收策略的区别: 除了影响对象的可达性状态,不同的引用类型还会影响垃圾收集器回收对象的激进程度: 强引用:...在虚拟机即将回收对象之前,如果发现对象还存在虚引用,则会在回收对象后会将引用加入到关联的引用队列中。程序可以通过观察引用队列的方式,来感知到对象即将被垃圾回收的时机,再采取必要的措施。...使用句柄的优点是让对象在垃圾收集的过程中移动存储区域的话,虚拟机只需要改变句柄中的指针,而引用持有的句柄是稳定的。缺点是需要两次指针访问才能访问到对象数据。...引用队列可以为空,但虚引用必须关联引用队列,否则没有意义; 2、获取实际对象: 在实际对象被垃圾收集器回收之前,通过 Reference#get() 可以获取实际对象,在实际对象被回收之后 get()...引用对象加入引用队列的过程发生在垃圾收集器的处理过程中,我将相关流程概括为 2 个阶段: 阶段 1: 在垃圾收集的标记阶段,垃圾收集器会标记在本次垃圾收集中豁免的对象(包括强引用对象、FinalizerReference
双重检查单例,为什么要加 volatile? 1.volatile想要解决的问题是,在另一个线程中想要使用instance,发现instance!...分代收集 GC 方法会吧堆划分为新生代、老年代 新生代:新建小对象会进入新生代;通过复制算法回收对象 老年代:新建大对象及老对象会进入老年代;通过标记-清除算法回收对象 2.方法区中的类信息、常量池...判断一个对象是否可被回收: 1.引用计数法 缺点:循环引用 2.可达性分析法 定义:从 GC ROOT 开始搜索,不可达的对象都是可以被回收的 GC ROOT 1.虚拟机栈/本地方法栈中引用的对象 2....方法区中常量/静态变量引用的对象 四种引用 强引用:不会被回收 软引用:内存不足时会被回收 弱引用:gc 时会被回收 虚引用:无法通过虚引用得到对象,可以监听对象的回收 ClassLoader 类的生命周期...以上内容均放在了开源项目:【github】 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...
由于Handler对象是在主线程中创建的,所以可以在handleMessage()方法中安心地进行UI操作。 通过一个例子来验证一下:活动MainActivity中有一个按钮和一个TextView。...原因是: 第一:当我们通过Handler对象的sendMessage()方法发送一个Message对象时,该Message对象持有对该Handler对象的引用(正是依靠这个引用,Looper在消息队列中取出该...第二,我们在主线程中创建Handler对象时,为了重写其handleMessage()方法,使用了匿名内部类的方式来创建该Handler对象。...如果我不持有对外部类的引用了,那么我怎么使用外部类的方法和对象?毕竟我是要在handleMessage()方法中进行UI操作的。...对于这种使用了静态内部类来避免内存泄露,同时又需要调用外部类的方法的情况:可以使用弱引用!即我们在该内部类中声明一个对外部类对象的弱引用。这样即可以调用外部类的方法,又不会导致内存泄露。
下面是我整理了网上很多大佬的经验分享对Android性能优化做了一个总结。...,而这时单例对象还在持有该对象的引用,这时GC就会无法回收该对象,造成了内存泄露的情况。...listview优化 listview优化相信大家也都比较熟悉了,也是比较经典的面试题,在这里就不详细赘述了,主要有复用view,首先判断view是否为空,如果不为空直接引用,为空再创建使用ViewHolder...因此在实际开发中,我们要尽量采用线程池,而不是每次都要创建一个Thread对象。...我根据自己的Android开发经验把这些性能优化的底层原理还有各种问题的解决方案和知识大纲都整理成了资料。希望能帮到你们。
方法中得到单个的消息进行处理 在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper...当Handler对象的构造函数的参数为空,则为当前所在线程的Looper; 2,Android的Activity的四种启动模式和用途 standerd 默认模式,可以不用写配置。...intent filter也是在manifest文件中声明的。...在Android中常见的内存泄漏原因: 1. 资源释放问题 程序代码的问题,长期保持某些资源,如Context、Cursor、IO流的引用,资源得不到释放 造成内存泄露。 2....为什么要使用convertView? 当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。
该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!...本篇内容我们来分析Android的消息机制。我们为什么要介绍Android的消息机制呢,因为Android系统本质上来说就是一个消息驱动的系统。...但是理解Android的消息机制对于理解Android系统的运作包括那些开源框架的原理都有很大帮助。 关于Android的消息机制网上也有好多文章,我本人也看了好多。...但是不仅没有让我更清晰明了,反而让我陷入更深的迷惑。本篇的目的在于以一种相对更容易理解的方式来解释。 我们先来模拟一个场景,在Activity中执行了耗时操作,耗时操作完成之后显示一个Toast。...、耗时操作、更新UI)在一个线程中完成,我们才有了多线程,多线程的互相协作才造就了我们这个Android欣欣向荣的世界。
该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!...---- 前言 上一篇中我们比较详尽的分析了ServiceManager。那么本篇我们来讲一下Android序列化的相关知识。为什么跨度那么大,因为“任性”?...Java中的Serializable Serializable 是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。...* 因为我在writeReplace中已经把序列化的实例指向了SerializableProxy * @param stream * @throws InvalidObjectException...至此我们就得到了反序列化的对象 ---- 本篇总结 我们本篇详细分析了Android序列化相关知识,你可以使用Java中的Serializable也可以使用Parcelable。
Java对象的引用的字段,需要执行下列操作: 使用 FindClass 获取类的类对象引用 使用 GetFieldID 获取字段的字段ID 使用适当函数获取字段的内容,例如GetIntFieldID 如果需要调用类对象中的方法...全局引用/局部引用: 传递给原生方法的每个参数,以及 JNI 函数返回的几乎每个对象都属于“局部引用”。这意味着,局部引用在当前线程中的当前原生方法运行期间有效。...获取全局引用的方法是通过NewGlobalRef和NewWeakGlobalRef函数,我们在JNI的开发中,将局部引用作为参数得到调用NewGlobalRef得到全局引用。...,多次调用NewGlobalRef得到的全局引用的值可能不同,可以使用IsSameObject来判断是否引用同一个对象。...是因为在indirectRef表中没有找到当前jobject对应的索引,导致报错了,为什么找不到这个索引,这个jobject还没有被定义为GlobalObject,这就和上面的分析对应起来了,在赋值的时候
对了我面试官允许我再秀一下知识广度,在Android中,Looper类就是利用了ThreadLocal的特性,保证每个线程只存在一个Looper对象。...使用InheritableThreadLocal可以实现多个线程访问ThreadLocal的值,我们在主线程中创建一个InheritableThreadLocal的实例,然后在子线程中得到这个InheritableThreadLocal...我先给大家介绍一下弱引用: 只具有弱引用的对象拥有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。...这就导致了一个问题,ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露...那为什么ThreadLocalMap的key要设计成弱引用? key不设置成弱引用的话就会造成和entry中value一样内存泄漏的场景。
比如 Kotlin 的空安全性就让点评的 Android 应用团队赞不绝口,而且团队开发者还可以通过在 Java 代码中使用 @Nullable 和 @NonNull 等注解来确保 Kotlin 代码获得正确的可空性推断...整体上看,Kotlin 的空安全特性帮助点评 Android 应用将空指针导致的崩溃从日均 3 个降低至 0。...团队成功将空指针异常的出现概率 降低了 80% 之多。 为了避免 NullPointerException,您需要确保正在处理的对象引用非 null,然后再调用方法或尝试访问其成员。...hashCode() 和 equals() 如果两个对象相等,那么它们的哈希代码应该相同。然而,经常会发生忘记实现其中一个方法或者在类中添加新属性时忘记更新。...结构相等与引用相等 两个对象是在结构上相等 (具有同等内容) 还是在引用上相等 (指针相同)?
每个线程还有自己的工作内存,变量在自己线程的工作内存中有份拷贝,线程直接操作的是这个拷贝 被 volatile 修饰的变量改变后会立即同步到主内存,保持变量的可见性 双重检查单例,为什么要加 violate...2.方法区中的类信息、常量池 判断一个对象是否可被回收: 1.引用计数法:有循环引用的缺点 2.可达性分析法:从 GC ROOT 开始搜索,不可达的对象都是可以被回收的。...其中 GC ROOT 包括虚拟机栈/本地方法栈中引用的对象、方法区中常量/静态变量引用的对象。...虚引用:无法通过虚引用得到对象,可以监听对象的回收 ClassLoader 类的生命周期:1.加载;2.验证;3.准备;4.解析;5.初始化;6.使用;7.卸载 类加载过程:1.加载:获取类的二进制字节流...四部分 Android 为什么选择 binder 性能:使用 mmap 一次数据拷贝实现 IPC,传统 IPC:用户 A 空间->内核->用户 B 空间;mmap 将内核与用户 B 空间映射,实现直接从用户
Hi,我是小彭。本文已收录到 GitHub · AndroidFamily[1] 中。...每次在创建标记为 finalizable 的对象时,虚拟机内部会同时创建一个关联的 FinalizerReference 引用对象,并将其暂存到一个全局的链表中 (如果不存在全局的变量中,没有强引用持有的...// 2.2 取出引用所指向的对象(不可思议,为什么不为空呢?)...我将整个过程概括为 3 个阶段: 阶段 1 - 首次 GC 过程: 当垃圾收集器发现对象变成不可达对象时,会解绑实际对象与引用对象的关联关系。...守护线程消费引用队列时,调用 ReferenceQueue#get() 只是返回暂存在 zombie 字段中的实际对象而已,其实此时关联关系早就解除了(这就是为什么 FinalizerReference
Kotlin为什么可以兼容Java,一个主要原因是Kotlin文件在经过Kotlin编译器编译后会生成Java字节码。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...其中非空引用的定义如下: 而可空引用需要使用安全符“?”,例如: 当调用的时候,也需要使用安全调用操作符,写作 ?. 可空调用。...例如: 通过函数调用给可空引用赋值,返回的必须也是可空引用,这就在编译期间杜绝了空指针异常。...但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。
简历上列举的项目多想想,为什么做这个项目?做这个项目的目标是什么?我的方案是什么?相对其他方案我的方案优势是什么?项目的收益是什么?项目的架构图是否能画出来?...编写代码测试,在 changeValue() 方法中修改入参,并不会改变之前的值;原理 :Java 程序设计语言总是采用按值调用,方法得到的是所有参数值的一个拷贝,即方法不能修改传递给它的任何参数变量的内容...基本类型参数传递的是参数副本,对象类型参数传递的是对象地址的副本;题解:在 changeValue() 中,对于对象类型参数,直接修改的是对象地址副本的值,所以之前变量的地址并未被修改!...student 是否需要判空?...去美团之前有没有 Android 开发经历? 当时为什么要选择去美团? 为什么要选择来北京? 为什么要换工作? 期望以后的工作是怎样的?
领取专属 10元无门槛券
手把手带您无忧上云