编辑手记:最近一个朋友遭遇到了这个问题,当GLOBAL_NAME被更新为空值之后,数据库无法启动,我们重温一下老熊的这个测试,记住结论,无论如何不要Update字典表。...在以前的一篇文章中( 数据库链:Database Link与GLOBAL_NAMES参数的关系 ),我提到千万不能将 Oracle 数据库的 global_name 更新为空。这不,事儿来了。...首先 UPDATE GLOBAL_NAME 为空,COMMIT 后以 abort 方式关闭数据库,以 abort 方式只是为了增加点难度。之后再启动数据库。...这里通过 DDL 的隐式提交特性来 UPDATE GLOBAL_NAME。其实还有更简单的办法:OCI 主动断开连接时的自动提交。...如果 UPDATE 之后,直接退出 sqlplus,UPDATEGLOBAL_NAME 的事务实际也提交了。看起来 ORACLE 这时只是不能执行显式的 COMMIT 语句。
ViewBinding 是 Android Gradle Plugin 3.6 中新增的特性,用于更加轻量地实现视图绑定(即视图与变量的绑定),可以理解为轻量版本的 DataBinding。...ViewBinding 是 Android Gradle Plugin 3.6 中新增的特性,用于更加轻量地实现视图绑定(即视图与变量的绑定),可以理解为轻量版本的 DataBinding。...1、创建和回收 ViewBinding 对象需要重复编写样板代码,特别是在 Fragment 中使用的案例; 2、binding 属性是可空的,也是可变的,使用起来不方便。...把函数 bind() 作为参数传递,bind 函数的参数为 View,返回值为 ViewBinding,与函数声明 (View) -> V 匹配。...总结 ViewBinding 是一个轻量级的视图绑定方案,Android Gradle 插件会为每个 XML 布局文件创建一个绑定类。
生成代码的方式 谷歌在 Android Studio 3.6 Canary 11 及更高版本中加入了新的视图绑定方式ViewBinding。...ViewBinding和Kotlin扩展 ViewBinding 和 Kotlin 扩展 都是 Android 开发中常用的技术,用于简化视图查找和绑定的过程。...以下是它们之间的一些比较: ViewBinding: ViewBinding 是由 Android 官方推荐和支持的库,从 Android Studio 3.6 版本开始引入。...Kotlin扩展: Kotlin扩展 是 Kotlin 语言的特性,其通过扩展函数的方式,允许开发者为现有的类添加新的函数或属性。...Kotlin扩展 对视图的数据获取和类型安全性没有提供直接的支持,需要手动处理可能的空指针异常和类型转换。 Kotlin扩展 会增加 APK 的大小,因为它是在运行时动态添加的函数。
但是由于Viewbinding的特殊性,它其实就会和当前的lifecycle绑定在一起。因为我们要在销毁的情况下把实例重置为空。...作者在定义的时候就将Viewbinding委托获取的实例定义为了非空,这里我和我的同事其实是存在一些分歧的,我认为非空其实挺合理的,但是对方并不认为。...恰巧这种空非空的问题,在实际的使用中就出现了很多不可预期的crash问题。比如说在一个异步操作中获取viewbinding实例然后进行赋值操作,就会出现空指针异常。...然后当onDestroyView执行的时候就会出现空指针异常了。那么Lifecycle有没有提供一个在onDestroyView之后的方法呢?我们是不是可以考虑自己造一个呢?...(android.view.View); public static *** inflate(...); } 它只会keep实现了ViewBinding的类的bind和inflate方法。
今天写创建文件夹的时候,怎么创建都不会,反复修改,确定错误是出在了string类型的变量上面。...,以及子文件夹,根据参数来做,有则略过,无则创建 但是我发现根本创建不了文件夹 我试着输出循环中的fileurl_s_cy[i],能够正常输出我想要的字符 但是当我输出fileurl_s_cy的时候出了问题...,fileurl_s_cy至始至终为空,长度也为空,导致无法正常创建文件夹 明明可以正常输出fileurl_s_cy[i],但是无法正常输出fileurl_s_cy,本以为是’\0’的问题,发现加上也无济于事...,所以无法使用 奇怪的是输出fileurl_s_cy[i]居然也不报错。...解决方法如下: 声明的时候改为std::string fileurl_s_cy(len,’\0’); 这样就可以正常使用下标赋值,输出以及整体输出 怕忘记,记录与此。
内存泄漏与 LeakCanary:从问题定位到修复思路为什么内存泄漏值得单独关注Android 应用运行在内存有限的移动设备上。...:leakcanary-android:2.14")}通常不需要额外初始化。...沿引用链向上找第一个不合理的强引用字段。判断这个引用属于哪类问题:静态持有、回调未解除、任务未取消、ViewBinding 未置空、Context 用错。修改后重新复现页面打开和关闭流程。...Fragment 的 ViewBinding 在 onDestroyView() 置空。注册监听必须能找到对应的反注册位置。...这条原则可以概括为:生命周期长的对象,不要强持有生命周期短的对象。小结内存泄漏不是玄学问题,它通常就是一条错误的引用链。
一、新版Android Studio编译运行 下载代码之后,我们就需要在Android Studio中运行,这里我们可以使用Google官网中最新的AS版本,这里我使用的版本如下图所示: 这里的版本是海豚...最后一点,项目使用的Android SDK是28,因此会在编译过程中,提示你下载28的SDK,下载之后再编译就好了,目前我编译了20分钟,终于编译完成了。...在app的build.gradle的android{}闭包中增加如下所示代码: buildFeatures { viewBinding true //开启ViewBinding...} 然后Sync Now,下面我们以AboutUsActivity为例来修改一下,使用ViewBinding。...这个封装的核心思路就是通过编译时生成类,类继承自ViewBinding,通过泛型可以传入任何继承自ViewBinding的类,传入的类通过反射拿到具体的类,再通过类拿到里面的方法,通过方法拿到实例化之后的
先建三个module,分别为Butterknife ButterKnife-Annotions ButterKnife-compiler,其中butterknife为Android Module其余的都是...viewBinding = new xxxActivity_ViewBinding(activity); try{ Class<?...; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import com.zzw.aptdemo.R...Butterknife.bind(this); textView1.setText("你好 大哥"); } @Override protected void onDestroy...() { super.onDestroy(); mUnbinder.unbind(); } } 该文中Butterknife module用到的类: import
销毁之后的空指针 KAE 是通过在字节码层面添加合成属性来解决 findViewById 的问题的,对于 Activity 和 Fragment 而言,合成的属性背后其实就是一个缓存,这个缓存会在 Activity...的 onDestroy、Fragment 的 onDestroyView 的时候清空。...主要是在 Fragment 当中,如果不小心在 onDestroyView 调用之后访问了这些合成的属性,就会抛一个空指针异常,因为此时缓存已经被清空,而 Fragment 的 View 也被置为 null...使用 ViewBinding 作为替代方案 那么问题来了,KAE 废弃之后会怎么样呢?按照链接当中的说明来看,废弃之后仍然可以使用,但会有一个警告;当然,出现问题官方也不会再修复了,更不会有新功能。...相比之下,KAE 比 findViewById 本身提供了更简便的 方式,也保证了 View 的类型安全,但却无法保证 View 的空安全 —— 而这些问题都在 ViewBinding 当中得到了解决。
当然,ViewBinding也不是银弹,对比kotlin-android-extensions,它也有一些问题: 使用比kotlin-android-extensions复杂 依然有需要手动处理的场景...当然也有一些优势: Kotlin Java通吃 空安全 ViewBinding初步 ViewBinding就是为了解决kotlin-android-extensions的这些使用问题而诞生的,它的目的只有一个...要使用ViewBinding非常简单: buildFeatures { viewBinding true } 当我们开启ViewBinding之后,在编译时,AGP会自动帮我们给每个xml布局创建一个...其实没什么区别,这是为了在Kotlin中将不可空类型置空的一种妥协方式,同样的代码逻辑,在Java中,就会非常简单了。...目前还未找到现有项目从kotlin-android-extensions迁移到ViewBinding的好办法,如果当前的项目大量使用kotlin-android-extensions,那么迁移起来,就是一个巨大的工程
在Activity中使用ViewBinding 一旦启动了ViewBinding功能之后,Android Studio会自动为我们所编写的每一个布局文件都生成一个对应的Binding类。...虽然这里我举的例子非常简单,但实际上ViewBinding用法的套路都是如此,掌握了这一套规则之后基本上你就可以举一反三了。...假设我们有一个布局文件叫fragment_main.xml,那么启用ViewBinding功能之后,则必然会生成一个与其对应的FragmentMainBinding类。...但由于Kotlin空类型系统的存在,导致为了实现这一简单的功能,需要额外编写一些看上去很奇怪的代码,上述代码就是如此。...关于Kotlin空类型系统这里我就不展开介绍了,还不了解的朋友可以去参考《第一行代码 第3版》第2章的内容。
image.png 当应用程序为对象分配内存,而对象不再被使用时却没有释放,就会发生内存泄漏。随着时间的推移,泄漏的内存会累积,导致应用程序性能变差,甚至崩溃。...那么在 Fragment 的onDestroy和活动的onDestroy之间就发生了内存泄漏。...他们提供的代码片段建议我们做以下工作: private var _binding: ResultProfileBinding?...,因为如果变量为空,这会抛出KotlinNullPointerException。使用显式空处理来代替。)...ViewBinding> { var binding: B?
前段时间, 在观望了许久之后, 我终于更新了Android Studio的最新版本(北极狐), 发现项目中使用ButterKnife注解id的代码出现了警告,警告信息如下: Resource IDs will...这意味着如果我们把Gradle插件升级到5.0版本之后ButterKnife将无法再被使用!...目前Android项目使用gson的居多, 并且是Google开源维护的,充分相信Google的实力....下面我简单列举一下: 类型安全: ViewBinding会基于布局中的View生成类型正确的属性。...空安全: ViewBinding会检测某个视图是不是只在一些配置下存在,并依据结果生成带有 @Nullable 注解的属性。所以即使在多种配置下定义的布局文件,视图绑定依然能够保证空安全。
Jetpack DataBinding 与 ViewBinding:从代码绑定到声明式视图在 Android 开发中,findViewById 曾是每个 Activity 和 Fragment 必写的模板代码...`_binding` 持有实例- 用非空的 `binding` 作为便捷访问器- 在 onDestroyView 中置空1.3 include 与 merge 布局的绑定如果布局中使用了 ``,ViewBinding...生成机制编译时,Gradle 插件扫描每个 XML 布局,为每个带 ID 的视图生成对应的字段:// 生成的 ActivityUserProfileBinding.javapublic final class...Binding 类在 setLifecycleOwner 后,自动注册为观察者3....和 DataBinding 是 Android 视图绑定的现代化方案:- ViewBinding:轻量、类型安全,适合大部分场景- DataBinding:声明式绑定,适合复杂表单和 MVVM 架构关键要点
ViewBinding 通过视图绑定,系统会为模块中的每个 XML 布局文件生成一个绑定类,通过绑定类,我们可以直接操作控件id,而不需要findViewById,这样我们可以避免控件id无效出现的空指针问题...首先我们新建项目,新建MainActivity,对应的布局文件名为:activity_main,在模块的build.gradle中开启视图绑定: viewBinding { enabled =...ViewBinding只是为了替代findViewById,优点就是空安全,不过有了kotlin-android-extensions之后,ViewBinding用的应该比较少了吧。...notifyPropertyChanged()发送通知,为BR 类是数据绑定生成的一个用于数据绑定的资源的 ID的类。...DataBinding和ViewBinding 到这里,我们已经可以使用基础的功能了,后续在项目开发中还需要多实践操作。
当程序编译完成之后,运行到自己手机上,先确保项目配置这一步没有问题。 二、页面设计 首先改一下主题的颜色,列如标题,改成绿色。...,如果都打开了就可以开始进行扫描蓝牙的操作了,在扫描之后先要确定蓝牙设备需要什么信息。...BaseQuickAdapter的使用,之前我是没有通过ViewBinding去进行布局绑定的,都是通过R.layout.item布局文件进行的,那么换成了ViewBinding要怎么操作呢?...然后就是扫描后的数据处理,之前里面可是啥也没有的。增加代码如下图所示: 当扫描到设备时添加到获取设备地址和设备名称,如果设备名称为null则赋值为Unkown。...然后根据地址列表的size去进行数据处理,为空直接添加,不为空则检查地址列表中是否存在之前设备地址,因为一个设备是可以被重复扫描到的,因此这是为了避免重复添加数据。
() { unbinder.unbind(); super.onDestroy(); } } 二、原理分析 最后编译一下项目。...MainActivity_ViewBinding类的实例。...既然可以返回MainActivity_ViewBinding的实例,那MainActivity_ViewBinding这个类肯定是存在的。...类型包括基元类型,声明的类型(类和接口类型),数组类型,类型变量和空类型。...+ "_ViewBinding"); // 判断父类元素是否为final类型 boolean isFinal = enclosingElement.getModifiers().contains
但后续Android 升级之后再依赖库中的R资源并不是find了。同时当Gradle 5.0之后Resource ID将不会是final类型了。...而如果我们先接触的DataBinding 那么就很容易将ViewBinding误解成两个是一样的。但其实他们并不一样。...ViewBinding 要想使用ViewBinding 必须Android Studio 3.6 Canary 11 以上版本才行。... 1.2 Activity 使用ViewBinding 我们如果开启ViewBinding之后,但是...也就是上面实例中设置为null。 这是因为Fragment的存活时间比它的视图时间长。否则会出现OOM异常。