首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android之ViewStub的简单使用

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

55830

谈一谈Android内存

我们写出了并不太理想的代码,这都是可以接受的,只要你会去持续优化,这些问题都会得到改善。而有些人是心有余而力不足,“也想优化,可是怎么去优化呢?”。...所以Android推出了基于AOT(Ahead Of Time)的ART。它是应用被安装的时候提前将.dex文件翻译成机器码放入手机,当程序被执行的时候无需实时的翻译,而是直接执行。...所以DalvikMark阶段又分解成下面的小阶段: ①(此阶段不允许其它线程工作):标记根集对象,所谓根集指的是被全局变量、栈变量和寄存器等引用对象 ②(此阶段允许其它线程正常工作):  a、标记被根集对象引用对象...为什么需要两个对象来标记呢?...c.静态集合要置 集合会引用存储的对象,静态的集合生命周期与应用一样,导致存储的对象的内存无法释放,所以不用的时候一定要将集合置

61320
您找到你想要的搜索结果了吗?
是的
没有找到

Android UI布局优化之ViewStub

一种是类被加载的时候就完成单例对象的初始化,一种是需要使用该单例的时候才初始化。 android的视图设计,同样需要使用的这样的设计模式。 这样的视图加载起来需要耗费很多的时间。...下面看看加载视图前后的对比图: 为了说明视图树加载前后的对比,使用hierarchyviewer视图树查看工具,做了一个前后对比图: 加载前视图树: 加载后视图树: 从上面的两个视图树我们明显发现...(到此,ViewStub从视图树种移除) parent.removeViewInLayout(this); // 得到ViewStub布局文件定义的...= null) { // 如果对待加载视图的软引用不为,说明已经执行过inflate方法了 // 因为inflate方法执行成功后有对其赋值 View...} else { // 如果引用的视图已经被垃圾回收器回收,则抛出异常 // 这也就是为什么setVisibility可以调用多次,但是并不推荐这样做的原因

67220

Android 知识简记:资深架构师带你快速回顾Android各种知识!

双重检查单例,为什么要加 volatile? 1.volatile想要解决的问题是,另一个线程想要使用instance,发现instance!...分代收集 GC 方法会吧堆划分为新生代、老年代 新生代:新建小对象会进入新生代;通过复制算法回收对象 老年代:新建大对象及老对象会进入老年代;通过标记-清除算法回收对象 2.方法区的类信息、常量池...判断一个对象是否可被回收: 1.引用计数法 缺点:循环引用 2.可达性分析法 定义:从 GC ROOT 开始搜索,不可达的对象都是可以被回收的 GC ROOT 1.虚拟机栈/本地方法栈引用对象...2.方法区中常量/静态变量引用对象 四种引用引用:不会被回收 软引用:内存不足时会被回收 弱引用:gc 时会被回收 虚引用:无法通过虚引用得到对象,可以监听对象的回收 ClassLoader 类的生命周期...知己知彼、百战不殆,无论学习还是面试也是如此,针对于上面的的知识点我总结出了互联网公司Android程序员面试涉及到的绝大部分架构面试题及答案做成了文档和架构视频资料免费分享给大家(包括APP开发框架知识

85330

Android平台的Swift—Kotlin

声明变量为可后,在运行时便不会抛出异常。 类型智能转换:通过is进行类型判断后,编译器自动进行类型转换。父类引用可以调用子类接口,注意转换只is的代码块中生效。...[1.png] Kotlin为什么可以兼容Java,一个主要原因是Kotlin文件经过Kotlin编译器编译后会生成Java字节码。...[16.png] ----- 二、新特性 1、安全 Kotlin是如何实现安全的呢? Kotlin对象声明分为可引用和非引用两种。...非引用: [17.png] 可引用: [18.png] 安全调用操作符,写作 ?. 可空调用: [19.png] 通过函数调用给可引用赋值,返回的必须也是可引用。...这就在编译期间杜绝了指针异常。但是这里要注意一点,如果从Java返回的集合,不会强制做可检查,这个是时候如果给不可引用赋值Java集合的null会出现转换错误异常。

3.4K90

JNI开发,你需要知道的一些建议

理论上可以一个进程拥有多个JavaVM对象,但Android只允许存在一个。 JNIEnv提供了大部分JNI功能。使用者定义的所有Native函数都会接收JNIEnv作为第一个参数。...相同对象引用却可能具有不同的值。例如,用相同对象连续地调用NewGlobalRef得到返回值可能是不同的。为了检查两个引用是否指向的是同一个对象,使用者必须使用IsSameObject函数。...连续的调用过程两个不同的对象却可能拥有相同的32位值。不要使用jobject的值作为key. 使用者需要“不过度分配”局部引用。...对于Android app,会发现从context对象得到应用私有数据存储的全路径是非常有用的。 上面是推荐的方式,但不是仅有的实现方式。...它们的支持是直接构建到JNI的,未来的版本中性能可能会得到提升。

1.3K30

JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型

只有强可达的对象才会认为是存活的对象,才能保证垃圾收集的过程不会被回收; 维度 2 - 垃圾回收策略的区别: 除了影响对象的可达性状态,不同的引用类型还会影响垃圾收集器回收对象的激进程度: 强引用:...虚拟机即将回收对象之前,如果发现对象还存在虚引用,则会在回收对象后会将引用加入到关联的引用队列。程序可以通过观察引用队列的方式,来感知到对象即将被垃圾回收的时机,再采取必要的措施。...使用句柄的优点是让对象垃圾收集的过程中移动存储区域的话,虚拟机只需要改变句柄的指针,而引用持有的句柄是稳定的。缺点是需要两次指针访问才能访问到对象数据。...引用队列可以为,但虚引用必须关联引用队列,否则没有意义; 2、获取实际对象实际对象被垃圾收集器回收之前,通过 Reference#get() 可以获取实际对象实际对象被回收之后 get()...引用对象加入引用队列的过程发生在垃圾收集器的处理过程将相关流程概括为 2 个阶段: 阶段 1: 垃圾收集的标记阶段,垃圾收集器会标记在本次垃圾收集中豁免的对象(包括强引用对象、FinalizerReference

52710

字节跳动年前再招聘1W+人,距离大厂 Offer,你还差这篇Android干货!

双重检查单例,为什么要加 volatile? 1.volatile想要解决的问题是,另一个线程想要使用instance,发现instance!...分代收集 GC 方法会吧堆划分为新生代、老年代 新生代:新建小对象会进入新生代;通过复制算法回收对象 老年代:新建大对象及老对象会进入老年代;通过标记-清除算法回收对象 2.方法区的类信息、常量池...判断一个对象是否可被回收: 1.引用计数法 缺点:循环引用 2.可达性分析法 定义:从 GC ROOT 开始搜索,不可达的对象都是可以被回收的 GC ROOT 1.虚拟机栈/本地方法栈引用对象 2....方法区中常量/静态变量引用对象 四种引用引用:不会被回收 软引用:内存不足时会被回收 弱引用:gc 时会被回收 虚引用:无法通过虚引用得到对象,可以监听对象的回收 ClassLoader 类的生命周期...以上内容均放在了开源项目:【github】 已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新...

68400

Android异步消息机制详解

由于Handler对象主线程创建的,所以可以handleMessage()方法安心地进行UI操作。 通过一个例子来验证一下:活动MainActivity中有一个按钮和一个TextView。...原因是: 第一:当我们通过Handler对象的sendMessage()方法发送一个Message对象时,该Message对象持有对该Handler对象引用(正是依靠这个引用,Looper消息队列取出该...第二,我们主线程创建Handler对象时,为了重写其handleMessage()方法,使用了匿名内部类的方式来创建该Handler对象。...如果不持有对外部类的引用了,那么怎么使用外部类的方法和对象?毕竟是要在handleMessage()方法中进行UI操作的。...对于这种使用了静态内部类来避免内存泄露,同时又需要调用外部类的方法的情况:可以使用弱引用!即我们该内部类声明一个对外部类对象的弱引用。这样即可以调用外部类的方法,又不会导致内存泄露。

1.5K10

Android性能优化:一份详细的布局优化实战指南,太特么重要了

下面是整理了网上很多大佬的经验分享对Android性能优化做了一个总结。...,而这时单例对象还在持有该对象引用,这时GC就会无法回收该对象,造成了内存泄露的情况。...listview优化 listview优化相信大家也都比较熟悉了,也是比较经典的面试题,在这里就不详细赘述了,主要有复用view,首先判断view是否为,如果不为直接引用,为再创建使用ViewHolder...因此实际开发,我们要尽量采用线程池,而不是每次都要创建一个Thread对象。...根据自己的Android开发经验把这些性能优化的底层原理还有各种问题的解决方案和知识大纲都整理成了资料。希望能帮到你们。

77430

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对象

1.3K90

Android开发之漫漫长途 Ⅶ——Android消息机制(Looper Handler MessageQueue Message)

该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!...本篇内容我们来分析Android的消息机制。我们为什么要介绍Android的消息机制呢,因为Android系统本质上来说就是一个消息驱动的系统。...但是理解Android的消息机制对于理解Android系统的运作包括那些开源框架的原理都有很大帮助。 关于Android的消息机制网上也有好多文章,本人也看了好多。...但是不仅没有让更清晰明了,反而让陷入更深的迷惑。本篇的目的在于以一种相对更容易理解的方式来解释。 我们先来模拟一个场景,Activity执行了耗时操作,耗时操作完成之后显示一个Toast。...、耗时操作、更新UI)一个线程完成,我们才有了多线程,多线程的互相协作才造就了我们这个Android欣欣向荣的世界。

41920

Android开发之漫漫长途 X——Android序列化

该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!...---- 前言 上一篇我们比较详尽的分析了ServiceManager。那么本篇我们来讲一下Android序列化的相关知识。为什么跨度那么大,因为“任性”?...Java的Serializable Serializable 是Java所提供的一个序列化接口,它是一个接口,为对象提供标准的序列化和反序列化操作。...* 因为writeReplace已经把序列化的实例指向了SerializableProxy * @param stream * @throws InvalidObjectException...至此我们就得到了反序列化的对象 ---- 本篇总结 我们本篇详细分析了Android序列化相关知识,你可以使用Java的Serializable也可以使用Parcelable。

35220

Android NDK开发完全剖析

Java对象引用的字段,需要执行下列操作: 使用 FindClass 获取类的类对象引用 使用 GetFieldID 获取字段的字段ID 使用适当函数获取字段的内容,例如GetIntFieldID 如果需要调用类对象的方法...全局引用/局部引用: 传递给原生方法的每个参数,以及 JNI 函数返回的几乎每个对象都属于“局部引用”。这意味着,局部引用在当前线程的当前原生方法运行期间有效。...获取全局引用的方法是通过NewGlobalRef和NewWeakGlobalRef函数,我们JNI的开发,将局部引用作为参数得到调用NewGlobalRef得到全局引用。...,多次调用NewGlobalRef得到的全局引用的值可能不同,可以使用IsSameObject来判断是否引用同一个对象。...是因为indirectRef表没有找到当前jobject对应的索引,导致报错了,为什么找不到这个索引,这个jobject还没有被定义为GlobalObject,这就和上面的分析对应起来了,赋值的时候

1.7K10

Java面试必问:ThreadLocal终极篇 淦!

对了面试官允许再秀一下知识广度,Android,Looper类就是利用了ThreadLocal的特性,保证每个线程只存在一个Looper对象。...使用InheritableThreadLocal可以实现多个线程访问ThreadLocal的值,我们主线程创建一个InheritableThreadLocal的实例,然后子线程得到这个InheritableThreadLocal...先给大家介绍一下弱引用: 只具有弱引用对象拥有更短暂的生命周期,垃圾回收器线程扫描它所管辖的内存区域的过程,一旦发现了只具有弱引用对象,不管当前内存空间足够与否,都会回收它的内存。...这就导致了一个问题,ThreadLocal没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象的value就有可能一直得不到回收,发生内存泄露...那为什么ThreadLocalMap的key要设计成弱引用? key不设置成弱引用的话就会造成和entryvalue一样内存泄漏的场景。

54010

减少崩溃,提升体验 | 使用 Kotlin 打造优质应用

比如 Kotlin 的安全性就让点评的 Android 应用团队赞不绝口,而且团队开发者还可以通过 Java 代码中使用 @Nullable 和 @NonNull 等注解来确保 Kotlin 代码获得正确的可空性推断...整体上看,Kotlin 的安全特性帮助点评 Android 应用将指针导致的崩溃从日均 3 个降低至 0。...团队成功将指针异常的出现概率 降低了 80% 之多。 为了避免 NullPointerException,您需要确保正在处理的对象引用非 null,然后再调用方法或尝试访问其成员。...hashCode() 和 equals() 如果两个对象相等,那么它们的哈希代码应该相同。然而,经常会发生忘记实现其中一个方法或者添加新属性时忘记更新。...结构相等与引用相等 两个对象是在结构上相等 (具有同等内容) 还是引用上相等 (指针相同)?

1.4K10

最新 Android 面试点梳理,收藏了你呢?

每个线程还有自己的工作内存,变量自己线程的工作内存中有份拷贝,线程直接操作的是这个拷贝 被 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 空间映射,实现直接从用户

69621

JVM 系列(6)吊打面试官:为什么 finalize() 方法只会执行一次?

Hi,是小彭。本文已收录到 GitHub · AndroidFamily[1] 。...每次创建标记为 finalizable 的对象时,虚拟机内部会同时创建一个关联的 FinalizerReference 引用对象,并将其暂存到一个全局的链表 (如果不存在全局的变量,没有强引用持有的...// 2.2 取出引用所指向的对象(不可思议,为什么不为呢?)...将整个过程概括为 3 个阶段: 阶段 1 - 首次 GC 过程: 当垃圾收集器发现对象变成不可达对象时,会解绑实际对象引用对象的关联关系。...守护线程消费引用队列时,调用 ReferenceQueue#get() 只是返回暂存在 zombie 字段的实际对象而已,其实此时关联关系早就解除了(这就是为什么 FinalizerReference

62310

是时候使用Kotlin编程了

Kotlin为什么可以兼容Java,一个主要原因是Kotlin文件经过Kotlin编译器编译后会生成Java字节码。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,安全 Kotlin对象声明分为可引用和非引用两种。...其中非引用的定义如下: 而可引用需要使用安全符“?”,例如: 当调用的时候,也需要使用安全调用操作符,写作 ?. 可空调用。...例如: 通过函数调用给可引用赋值,返回的必须也是可引用,这就在编译期间杜绝了指针异常。...但是这里要注意一点,如果从Java返回的集合,不会强制做可检查,这个是时候如果给不可引用赋值Java集合的null会出现转换错误异常。

3.2K10

2020年开春最新面试!今日头条安卓面试题及答案 (已拿到 offer)

简历上列举的项目多想想,为什么做这个项目?做这个项目的目标是什么?的方案是什么?相对其他方案的方案优势是什么?项目的收益是什么?项目的架构图是否能画出来?...编写代码测试, changeValue() 方法修改入参,并不会改变之前的值;原理 :Java 程序设计语言总是采用按值调用,方法得到的是所有参数值的一个拷贝,即方法不能修改传递给它的任何参数变量的内容...基本类型参数传递的是参数副本,对象类型参数传递的是对象地址的副本;题解: changeValue() ,对于对象类型参数,直接修改的是对象地址副本的值,所以之前变量的地址并未被修改!...student 是否需要判?...去美团之前有没有 Android 开发经历? 当时为什么要选择去美团? 为什么要选择来北京? 为什么要换工作? 期望以后的工作是怎样的?

1.9K11
领券