(binding.root) } △ 在 Activity 中使用视图绑定 使用视图绑定时,无须再调用 findViewById 方法,只要直接调用绑定对象中的对应属性即可。...一个常见的错误用法是: 在开启了视图绑定的同时,依然在 setContentView(…) 中传入布局的 id 而不是绑定对象。这将造成同一布局被填充两次,同时监听器也会被添加到错误的布局对象中。...空安全: 视图绑定会检测某个视图是不是只在一些配置下存在,并依据结果生成带有 @Nullable 注解的属性。所以即使在多种配置下定义的布局文件,视图绑定依然能够保证空安全。...这意味着您的修改会立即反映在绑定对象中,而无须等待或者重新构建工程。 Android Studio 被优化为可以在您编辑过 XML 布局文件后立即更新绑定对象。...△ 视图绑定空安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时也更简洁 上图为对比视图绑定、ButterKnife 和 Kotlin 合成方法的功能。
(binding.root) } △ 在 Activity 中使用视图绑定 使用视图绑定时,无须再调用 findViewById 方法,只要直接调用绑定对象中的对应属性即可。...一个常见的错误用法是: 在开启了视图绑定的同时,依然在 setContentView(...) 中传入布局的 id 而不是绑定对象。...这将造成同一布局被填充两次,同时监听器也会被添加到错误的布局对象中。...空安全: 视图绑定会检测某个视图是不是只在一些配置下存在,并依据结果生成带有 @Nullable 注解的属性。所以即使在多种配置下定义的布局文件,视图绑定依然能够保证空安全。...△ 视图绑定空安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时也更简洁 上图为对比视图绑定、ButterKnife 和 Kotlin 合成方法的功能。
导读: 本篇文章的前半部分为源码分析,后半部分为一个例子,在例子中我们会遇到一些问题,从而回答前半部分留下的问题!...(); } 点进来之后我们发现它里边调用了getWindow.setContentView,我们点击getWindow看看里面是什么!...当mContentParent为空的时候,会执行installDecor()方法,那么我们肯定是到installDecor中去找答案咯,点进去!...如果为空说明我们还没有DecorView,然后调用installDecor,之后我们的DecorView就准备好了,mContentParent也指向了我们的ContentView,由于是新建的,我们的...例子: 我们现在就来模拟一个需求,比如用户在MainActivity填写一个表单,这个表单有姓名和电话两个字段,当用户填完之后我们要进行提交,但是在提交之前我们希望有一个确认表单的页面来让用户确认一下信息是否填对
用它可以发送消息,也可以用它处理消息。在Android开发中有着非常重要的地位。 0x12 为什么要使用Handler 当一个应用程序运行时,它会创建一个进程。...当使用Message对象在线程间传递消息时,如果它包含一个Parcelable的结构类(不是由应用程序实现的类),此字段必须为非空(non-null)。...如果Bundle对象不存在返回null。 public Bundle getData():获取附加在此事件上的任意数据的Bundle对象,需要时延迟创建。...非静态(匿名)内部类会持有外部对象,当我们这样重写Handler时它就成为了一个匿名内部类,这样如果调用finish方法时Handler有Message未处理的话,就会导致Activity不能被销毁。...可以同时使用静态内部类和弱引用,当一个对象只被弱引用依赖时它便可以被GC回收。
当你点击设备上的应用图标 就打开了 MainActivity,在我们的代码中 MainActivity 的 onCreate 方法被系统调用,在这个方法中有一个 setContentView 方法,它是资源布局...为了在应用运行时能与这些视图进行交互并且修改它们,例如修改文本或者修改按钮,那么我们需要找到 Java 对象,一旦我们找到它们,我们可以在 MainActivity 中用引用指向它们,记住,我们没有创建新的...之后我们可以在 Java 代码中引用它们了。...但是我们还是不知道如何建立变量和具体的 Java 对象之间的联系,对于这个变量和 Java 对象 情况也是如此,在AppCompatActivity 类中,有一个具体的方法就是调用 findViewById...这就意味着在 activity 代码中 我们可以调用 findViewById传入我们所需 View 的资源 id,然后它就会返回一个 View 对象,我们就可以把它当做变量存在 activity 中(
③之后该消息会被添加到MessageQueue中等待被处理,而Looper会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler对象中的handleMessage()方法中。...原因是: 第一:当我们通过Handler对象的sendMessage()方法发送一个Message对象时,该Message对象持有对该Handler对象的引用(正是依靠这个引用,Looper在消息队列中取出该...以上两个结合在一起,问题就来了:Message对象持有Handler对象引用,Handler对象持有MainActivity的引用。...如果Message对象在子线程中被发送至消息队列,然后一直没有被处理,该活动所在的主线程也会一直挂着,而不会被内存回收。所以,会导致内存泄露。 知道了原因,那么解决方法是什么?...对于这种使用了静态内部类来避免内存泄露,同时又需要调用外部类的方法的情况:可以使用弱引用!即我们在该内部类中声明一个对外部类对象的弱引用。这样即可以调用外部类的方法,又不会导致内存泄露。
内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏。...不过即使不重用适配,也仅仅造成当前页面的内存浪费;一旦用户离开该页面,原列表页面的内存就统统回收。所以严格来说,这种情况不是真正意义上的内存泄漏,只是内存管理不善造成的内存浪费。...重用适配可先判断convertView,如果该对象为空,则分配视图对象,并调用setTag方法保存视图持有者;如果该对象非空,则调用getTag方法获取视图持有者。...实测发现,即使recycle也存在内存泄漏,只是没recycle的话泄露有十倍。比如recycle之后,内存仍泄漏40K;但是如果没有recycle,那么内存泄漏有400K。...为解决该问题,在构造Handler类时就得初始化目标的弱引用,弱引用不同于前面的引用(强引用),弱引用相当于一个指针,指针指向的地址随时可以回收,这又带来一个新问题,就是弱引用指向的对象可能是空的。
概述 在我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样会导致很多的模版代码出现。...如下图所示: 在这里插入图片描述 使用此生成类引用XML布局文件中的控件 调用生成类ActivityDescriptionBinding的inflate()方法获得类实例对象,通过getRoot()方法可以获得...TextView错误的赋值给一个Button变量,都会报错,这一错误很容易出现,关键在错误还出现在运行时,而不是编译时!...就是在我们访问那个View的时候它不存在。为什么会出现这种情况呢?例如不小心使用了错误的Id,或者访问的时候那个view还不存在。...相比较于 findViewById 和 Butter Knife两种方式还是方便很多的。而且 ViewBinding 在使用的过程中不存在类型转换以及空指针异常的问题。
概述 在我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样会导致很多的模版代码出现。...如下图所示: [6zaktkd4l5.png] 使用此生成类引用XML布局文件中的控件 调用生成类ActivityDescriptionBinding的inflate()方法获得类实例对象,通过getRoot...,例如不小心将一个TextView错误的赋值给一个Button变量,都会报错,这一错误很容易出现,关键在错误还出现在运行时,而不是编译时!...就是在我们访问那个View的时候它不存在。为什么会出现这种情况呢?例如不小心使用了错误的Id,或者访问的时候那个view还不存在。...相比较于 findViewById 和 Butter Knife两种方式还是方便很多的。而且 ViewBinding 在使用的过程中不存在类型转换以及空指针异常的问题。
前言 内存管理的目的就是让我们在开发过程中有效避免我们的应用程序出现内存泄露的问题。内存泄露相信大家都不陌生,我们可以这样理解:「没有用的对象无法回收的现象就是内存泄露」。...如果程序发生了内存泄露,则会带来以下这些问题 应用可用的内存减少,增加了堆内存的压力 降低了应用的性能,比如会触发更频繁的 GC 严重的时候可能会导致内存溢出错误,即 OOM Error OOM 发生在...sample = new Sample(MainActivity.this); 被弱引用关联的对象只能存活到下一次垃圾回收之前,也就是说即使 Sample 持有 Activity 的引用,但由于 GC...会帮我们回收相关的引用,被销毁的 Activity 也会被回收内存,这样我们就不用担心会发生内存泄露了。...解决方法:在集合元素使用之后从集合中删除,等所有元素都使用完之后,将集合置空。
常见的内存泄漏 单例造成的内存泄漏 单例在Android中经常使用,如果使用不当会造成内存泄漏,因为单例的静态特性使得他的生命周期与应用的生命周期一样长,这就造成当前对象的生命周期比单例短,单例又持有该对象的引用...Activity中调用的,然后关闭该Activity则会出现内存泄漏。...解决方案: 静态内部类+弱引用 将Handler的子类设置成 静态内部类,并且可加上 使用WeakReference弱引用持有Activity实例 原因:弱引用的对象拥有短暂的生命周期。...而垃圾回收器不管内存是否充足都会回收弱引用对象。...Activity onDestroy 或者某类生命周期结束之后一定要 unregister 或者 close 掉,否则这个 Activity 类会被系统强引用,不会被内存回收。
3、把project.properties中的target改为23(注意库工程和app工程都要改),不然会出现如下错误: Error:Error retrieving parent for item:...2、基于上一点,新控件可取到SearchAutoComplete的对象,因此我们可给该对象注册自动完成的字符串适配器,在用户输入文字时,界面会自动弹出符合搜索条件的关键词列表; 3、setAppSearchData...Toolbar运行问题处理集锦 更换导航栏还是存在一些兼容问题的,下面是博主发现的几个情况及其解决办法: 1、溢出菜单的菜单项已经设置为android:showAsAction="ifRoom",但即使工具栏上还有空间...,该菜单项也不会显示在工具栏上。...getActionView方法获取SearchView对象时,发现取到的SearchView为空。
在某些罕见的情况下,泄露的类甚至可以逗留很长时间来接收已注册的回调,这会导致一些非常奇怪的错误,并往往抛出臭名昭著的IllegalStateException异常。...如果没有调用注销方法,被引用的对象已经被终止后,监听实例可能会持有该对象很长的时间,从而导致泄漏内存。...在Android中,如果该对象是一个Activity对象,是特别麻烦的,因为他们往往拥有大量的数据。让我告诉你,可能是什么样子。...内部类 内部类在Java中是一个很常见的数据结构。它们很受欢迎,因为它们可以以这样的方式来定义:即只有外部类可以实例化它们。很多人可能没有意识到的是这样的类会持有外部类的隐式引用。...匿名类 这种类型的类和内部类有同样的缺点,即他们持有外部类的引用。如同内部类,一个匿名类在Activity生命周期之外执行或在其他线程执行工作时,可能会导致内存泄漏。
3.1 当发生继承时,扩展函数由于本质上是静态方法,它会严格按照参数类型去执行调用,而不会去优先执行或者主动执行父类的方法,如下的例子所示: open class A class B:A() fun...3.3 Kotlin严格区分了可能为空和不为空的入参类型,同样也应用在扩展函数的中,为了声明一个可能为空的接受者类型,可以参考如下例子: fun MutableList?....()是一个定义在类G内部的扩展函数,在这个扩展函数里,我们直接使用Int类型作为接受者类型,因为我们将扩展函数定义在了类的内部,即使我们设置访问权限为public,它也只能在该类或者该类的子类中被访问,...如果我们设置访问权限为private,那么在子类中也不能访问这个扩展函数。...5.2 Android View 胶水代码 回到最开始的例子,对于Android开发来说,对findViewById()这个方法一定不会陌生,为了获取一个View对象,我们总得先调用findViewById
setContentView的原理是什么? Activity在onResume之后才会显示出来的原因是什么?...上面setContentView是建立好了整个ViewTree的数据结果,但并没有将界面UI真正的绘制到屏幕上。 ?...我们知道整个页面UI的显示,是在onResume这个生命周期函数之后显示的,而上面的setContentView是在Activity的onCreate生命周期中进行的,在onCreate的时候就已经生成好了整个页面绘制的...ViewTree数据,那么在onResume中做了什么事情,才是的ViewTree数据被真正显示在屏幕上的呢?...DecorView会对应一个ViewRootImpl对象,这个ViewRootImpl可以通过IWindowSession向WMS发起Binder调用,而WMS也可以通过IWindow向应用端发起Binder
1.1.1 DataBinding 以前 在 DataBinding 出现以前,想要改变视图 就要引用该视图: TextView textView = findViewById(R.id.sample_text...App内页面和控件数量繁多,一个控件可能会多处调用,这就会有出现空指针的可能,那如何完全避免呢?...而user是否为空 DataBinding也会自动处理:在表达式 @{user.name} 中,如果 user 为 Null,则为 user.name 分配默认值 null。...所以 DataBinding 的本质就是 终态数据 与 UI控件 的绑定,具有以下优势: 无需多处调用控件,原本调用的地方只需要set数据即可 1的延伸,无需手动判空 1的延伸,完全不用写模板代码 findViewById...过程中也阅读了大量 相关优秀的文章 ,学习到了不同的观点。虽然整个系列是经过 阅读源码、实际使用、阅读其他优秀文章 之后输出的,但不免出现错误和遗漏,欢迎大家 留言讨论。
在app下的build.gradle的dependencies中进行引入,当然高版本也容易出现问题。...源码分析 在使用ButterKnife的时候其实我们是否注意到一个问题,我们一定需要写一个这样的一段代码。 ButterKnife.bind(this); 如果不写会出现下方这样的错误。...Override public void onClick(View v) { } }); } 我们能够发现没有加入这句的话的代码出现对象为空的情况...文件也不多,那我们可以一个个看,但是每次看之前我们都要明确一个目标,当然这是我的一个猜测,他应该要对注解进行一个收集,然后再进行一个源码的生成,而且这个文件中,可能会出现几个如下的特征: (1)输出的时候会出现一个后缀...(3)编译时就会调用到的一个注解 在ButterKnifeProcessor中我们发现了一个注解@AutoService(Processor.class)说明了这个文件,而这个注解就是为了编译时进行加载的
Android 系统似乎也意识到了这一点,在新版本的系统更新中,限制了很多在桌面提示窗口相关的权限。所以,从体验上考虑,这个情况并不属于问题。 “那么我们可以选择哪些窗口的类型呢?”...但是, setContentView 函数需要我们主动调用,如果我并没有调用这个 setContentView 函数,installDecor 方法将不被调用。...当然有,除了在 setContentView 函数中调用installDecor外,还有一个函数也调用到了这个,那就是: //code PhoneWindow.java @Override public...是不是在 WindowManager.addView 之后呢?我们在 onResume之后会调用Activity.makeVisible,里面会调用 WindowManager.addView。...,我们在 WindowManager.addView 之后,也并没有绘制界面。
领取专属 10元无门槛券
手把手带您无忧上云