作者 / Florina Muntenescu, Android Developer Advocate 每一个用户都希望从应用中获得无缝体验。崩溃会导致差评增加、应用卸载,甚至有损品牌认可度。...比如 Kotlin 的空安全性就让点评的 Android 应用团队赞不绝口,而且团队开发者还可以通过在 Java 代码中使用 @Nullable 和 @NonNull 等注解来确保 Kotlin 代码获得正确的可空性推断...整体上看,Kotlin 的空安全特性帮助点评 Android 应用将空指针导致的崩溃从日均 3 个降低至 0。...避免 NullPointerException NullPointerException (空指针异常) 是 Google Play 上崩溃的第一大原因。...然而,经常会发生忘记实现其中一个方法或者在类中添加新属性时忘记更新。当处理仅用于保存数据的类时,请使用 Kotlin 数据类。
1、空类型安全 1.1、可空类型正确用法 kotlin是强类型判断的,每一个对象都有可以为空和不可以为空之分。...但是在kotlin中,当mUser为null时,mUser?.grade的取值为null,而null != -1 ,在kotlin是成立的,这就不符合我们实际逻辑了。 解决方法如下:通过 ?...String 2、TODO 语句报错问题 在kotlin开发中,当实现某个抽象方法时,会自动生成一条TODO语句。...:"android coder" } 3.6、自定义崩溃信息 如果我们使用 !!,那么当这个变量为 null 时,只会简单的抛出一个 KotlinNullPointerException。...上。 注意:不要相信 AS 编译器,使用快捷键 Override Method 时,还是需要额外关注参数是否 Nullable?
ViewModel允许数据在Configuration改变时(比如屏幕旋转)保存,并且在旋转后恢复。 UI Controller相关的Android框架则是Activity与Fragment。...例如你的APP可能包括了很多用户的数据,当Activity因为Configuration改变而重建时,新的Activity需要重新获取这些数据,而一般会使用onSaveInstanceState方法保存...for Kotlin // alternatively - just LiveData implementation "android.arch.lifecycle:livedata:...而当Activity被销毁时,Framework会回调ViewModel对象的onCleared方法,以至于可以让我们在该方法内部进行资源清理,避免内存泄漏。 ?...> selected = new MutableLiveDataItem>(); public void select(Item item) { selected.setValue
这里就不得不提 Kotlin 在可空性方面的优势了。Kotlin 将可空性直接融合到了类型系统中,这意味着开发者在声明一个参数时,需要提前说明该参数能否接纳 null 值。...return currentName; } 复制代码 添加 @Nullable 注释后,当您在 Kotlin 文件中使用 getCurrentName 的结果时,您必须先进行 null 值检查,...才能对其解析引用,否则会触发 Android Studio 报错,而且 Kotlin 编译器也会在构建时抛出错误。...下一步 如果您正在使用 Kotlin 编写代码,当您从 Android 10 升级至 Android 11 SDK 后,您可能会遇到一些新的编译器警告,另外,之前的警告也可能会以错误形式出现。...您可以通过在代码中添加空值检查来解决这些警告或报错。
品果的技术总监李涛和技术团队成员很早就在关注Kotlin 语言,当 Kotlin 成为 Android 官方语言后,品果便开始在内部组织学习,并在项目实践中推广Kotlin。...而重构老代码时,接近 200 行的 Java 代码用 Kotlin 重构后,平均只需要 86 行。除此之外,使用 Kotlin 的项目在稳定性方面也有所提升,NPE 错误的出现频率明显降低。...品果使用 Android Vitals 将过度唤醒事件从 4.51% 下降到了 0.01%,崩溃率从 0.99% 下降到了 0.27%,月度评分从 4.341 提升到了 4.471,并在推出动态贴纸等功能后在日本市场大受欢迎...品果还在研究 Google 的 ARCore 等最新功能,试图为用户提供更新鲜的影像体验。...v=r6i… 点击这里您可查看更多 Android 和 Google Play 相关内容信息
XML 代码 activity_item_list.xml 设计效果图 AppCompatActivity 在使用Android Studio开发Android应用的时候,创建项目时,自动继承的是AppCompatActivity...此片段在双窗格模式 (在平板电脑上) 包含在 ItemListActivity 中,在手机上则是包含在ItemDetailActivity中。...一般来说,在 Fragment 中应至少重写下面3个生命周期方法: onCreate() 当创建 Fragment 实例时,系统回调的方法。...onCreateView() 当第一次在 Fragment 上绘制UI时,系统回调的方法。...由于平板比手机屏幕大的多,因此平板上可以呈现更多的内容,而 Fragment 可以实现同一视图布局在不同大小的屏幕上显示不同的效果,将 Fragment 加入到 Activity 的 Layout 中,
在之前我写Java版的时候特别弄了一个工具类,里面有针对性状态栏的一些样式和颜色改动,但实际上我只用了其中的一个方法,为了一个方法而去写一个工具类显然多此一举了。...** 这个你就不明所以了,因为Java中是没有的,这里解释一下,首先是Kotlin对于空安全做了处理, **!!** 表示当前对象不会空的情况下执行,而 **?...而当多个条件对应一个执行业务时,条件之间用英文逗号隔开,一行代码完成一个条件分支,很简洁,但是不要忘了加上else,这是标准写法,你不加也没事,就如同你写switch/case不加default一样。...()); } 这么一看是不是觉得Kotlin的语法很简单,它允许你的返回值一致的判断进行直接赋值,比如这里判断设备名称为空则显示无名二字,不为空则显示设备名,这两个返回都是String...= null) { //当适配器不为空时,这时就说明已经有数据了,所以清除列表数据,再进行扫描 list.clear()
,不过就怕写了没有人看,因为在国内Kotlin是受众群体确实比较少,当然了也是有大的方向在往这边推动的,但是小公司依然不会去用Kotlin,如果你看不惯我这个说法也不要告诉我。...在之前我写Java版的时候特别弄了一个工具类,里面有针对性状态栏的一些样式和颜色改动,但实际上我只用了其中的一个方法,为了一个方法而去写一个工具类显然多此一举了。...这个你就不明所以了,因为Java中是没有的,这里解释一下,首先是Kotlin对于空安全做了处理, !! 表示当前对象不会空的情况下执行,而 ? 表示当前对象可以为空。...而当多个条件对应一个执行业务时,条件之间用英文逗号隔开,一行代码完成一个条件分支,很简洁,但是不要忘了加上else,这是标准写法,你不加也没事,就如同你写switch/case不加default一样。...= null) { //当适配器不为空时,这时就说明已经有数据了,所以清除列表数据,再进行扫描 list.clear()
kotlin-android-extensions插件可能算得上是我最喜欢的一个Kotlin在Android上的特性了。...然而它被废弃了 其实早在几个月前,就有朋友在公众号上询问我,说自己升级了Android Studio 4.1之后,发现新建项目的时候Android Studio已经不会自动帮我们引入kotlin-android-extensions...还有,虽然HashMap是一种O(1)时间复杂度的数据结构,但这毕竟只是理论上的时间复杂度,实际调用肯定是没有直接访问控件实例快的,因此kotlin-android-extensions插件也在无形当中降低了程序的运行效率...="Done" /> 可以看到,这里最外层的布局使用了merge标签,这就表示当有任何一个地方去include这个布局时,会将merge标签内包含的内容直接填充到include的位置...首先为了避免崩溃,我们应该将activity_main.xml中引入布局时指定的id移除,如下所示: android="http://schemas.android.com
使用绑定对象编写安全性更佳的代码 findViewById 是许多用户可见 bug 的来源: 我们很容易传入一个布局中根本不存在的 id,从而导致空指针异常而崩溃;由于此方法类型不安全,也很容易使人写出像...空安全: 视图绑定会检测某个视图是不是只在一些配置下存在,并依据结果生成带有 @Nullable 注解的属性。所以即使在多种配置下定义的布局文件,视图绑定依然能够保证空安全。...生成代码的逻辑被优化为,当您在 Android Studio 中编辑 XML 布局文件时,只会更新所修改布局对应的绑定对象。同时这些工作会在内存中运行,从而使这个过程可以迅速完成。...bind(rootView) -- 在您已经获得对应视图,并且只想通过视图绑定来避免使用 findViewById 时使用。这个方法在使用视图绑定改造和重构现有代码时非常有用。...△ 视图绑定空安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时也更简洁 上图为对比视图绑定、ButterKnife 和 Kotlin 合成方法的功能。
所以对于一般Android开发中来说,不使用Sequence其实差别不大。。。哈哈。。 协程 有些人会错误理解kotlin的协程,觉得它的性能更高,是一种“轻量级”的线程,类似go语言的协程。...但是如果你细想一下,这是不太可能的,最终它都是要在JVM上运行,java都没有的东西,你就实现了,你这不是打java的脸嘛。...既然Kotlin中没有这个机制已经是既成事实,那么我们在使用中就需要考虑它带来的影响。比如我们开发中在调用一些方法时,要注意看一下源码中是否有指定异常抛出,然后做相应处理,避免不必要的崩溃。...jsonObject.getString("id") ... } 在java中我们需要处理JSONException,kotlin中因为没有Checked Exception,如果我们像上面这样直接使用...,虽然程序可以运行,可是一但解析出现异常,程序就会崩溃。
面试时了解到,该公司是在车载设备上开发 APP 的,听上去好像很高大上,是由吉利投资的。...海康威视 吸取了之前面试失败的教训,所以又让同学 B 给我内推了海康威视,正好也在招 Android 开发。...当贝网络 这家公司是自己在 BOSS 直聘上投的(没有打广告),之后收到面试通知,约在了工作日的晚上,打算下班了赶过去面试。...在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化; 内存泄漏。...有赞 有赞这家公司也是我在 BOSS 上投的(真的没有打广告),投完之后,两三天内一点消息都没有,我以为是看不上我了。结果之后发短信给我说需要电话面试我,那就来吧来吧,没啥好虚的。
为什么会有Intrinsics等判断代码呢 不是说 Kotlin 是空指针安全,有可空(Any?)...是的,你的这句话基本上没有毛病,但是有一个前提,那就是空指针和两种类型的特性,目前只在纯kotlin中生效,一旦涉及到和Java交互时,就不灵了。...项目设置编译选项 其他Intrinsics出现的场景 checkExpressionValueIsNotNull 当Kotlin 调用 Java 获取表达式结果后需要进行操作时,会增加Intrinsics.checkExpressionValueIsNotNull...非空断言时,会有校验非空断言结果的检查,如果有问题,则抛出NPE. 1 2 3 4 5 6 7 8 /** * if (message == null) { Intrinsics.throwNpe...toInt() } throwUninitializedPropertyAccessException 当尝试访问一个lateinit的属性时,会增加是否初始化的判断,如果有问题,会抛出异常。
Kotlin 简介Kotlin 是由 JetBrains 开发的一种静态类型编程语言,完全兼容 Java 语言,可以运行在 Java 虚拟机(JVM)上。...Kotlin 在 Android 开发中的应用Kotlin 被广泛应用于 Android 开发。由于 Kotlin 与 Java 兼容,可以在现有的 Java 项目中渐进式地引入 Kotlin 代码。...Android 官方推荐使用 Kotlin 开发 Android 应用,Kotlin 更加简洁、安全,尤其在处理异步操作时表现得尤为优秀。6....无论是在 Android 开发中,还是在服务器端、Web 开发等领域,Kotlin 都展现出了其强大的能力。...随着 Kotlin 的普及,越来越多的开发者选择 Kotlin 来替代 Java,特别是在开发 Android 应用时,Kotlin 的优势尤为明显。
2.对于可空对象,使用let比较方便。对于非空对象可以使用with。 3.apply和also也非常相似,文档给出的建议是如果是对象配置操作使用apply,额外的处理使用also。...所以对于一般Android开发中来说,不使用Sequence其实差别不大。。。哈哈。。 协程 有些人会错误理解kotlin的协程,觉得它的性能更高,是一种“轻量级”的线程,类似go语言的协程。...但是如果你细想一下,这是不太可能的,最终它都是要在JVM上运行,java都没有的东西,你就实现了,你这不是打java的脸嘛。...既然Kotlin中没有这个机制已经是既成事实,那么我们在使用中就需要考虑它带来的影响。比如我们开发中在调用一些方法时,要注意看一下源码中是否有指定异常抛出,然后做相应处理,避免不必要的崩溃。...,虽然程序可以运行,可是一但解析出现异常,程序就会崩溃。
前言 在2021年正式到来之前再更新几篇天气APP的文章,说实话现在对于这个APP的更新速度是比较缓慢的,一方面我有工作在进行,同时在写其他的文章,其次我正在使用Kotlin语言重写天气APP,...然后在layout中创建一个item_main_city_change.xml selected_bg_color" android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen...这里我改变了触摸item时的背景样式和文字颜色样式,样式都放在drawable下。...="true" android:drawable="@drawable/selected_bg_radius"/> selected_bg_radius.xml <?
第13章 使用 Kotlin 和 Anko 的Android 开发 ---- 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 点击这里 > 去天猫商城购买阅读 非常感谢您亲爱的读者...例如,在 Java 中我们可以通过在字段上使用 @BindView 来替代 findViewById 的调用。...这个插件是建立在ButterKnife 7的基础上的。 下面我们配置一下在 Kotlin 中使用 Butter Knife 的依赖库 KotterKnife。...rrvLayoutType="LinearLayout" /> 我们看下RealmRecyclerView的配置: 配置项 功能说明 app:rrvEmptyLayoutId 当列表为空的时候的显示页面...Screenshot_1500669255.png 本章小结 Android 中经常出现的空引用、API的冗余样板式代码等都是是驱动我们转向 Kotlin 语言的动力。
第三周 Day 15:sealed 类 Kotlin 的 sealed 类可以让您轻松的处理错误数据,当结合 LiveData 您可以用一个 LiveData 同时代表成功和失败的路径,这比用两个不变量要好...Day 17:Lateinit Android 中,在 onCreate 或者其它的回调初始化对象,但在 Kotlin 中不为空的对象必须初始化。那么怎么办呢?可以输入 lateinit。...第三周学习小结: 本周主要讨论一些基本的 Kotlin 特性,如运算符重载,内联,运算符重载,懒加载,以及非常强大的 inLine,并展示了使用 Android KTX 处理内容值,捆绑包和回调时如何编写更简洁的代码...Android 上 Kotlin 的另一个 DSL 是 Anko。Anko 允许您使用声明性代码构建 Android 视图。...Android KTX 具有一系列功能,可以使您的代码在使用图形包中的类时更加简洁。 Day 28:Sequences, lazy 和 generators 序列是从未存在的列表。
代码约定 中所提到的,当具有下面列举的特点时使用属性,不然更推荐使用函数: 不会抛出异常。...实际上,目前我们大多数的 Android 项目都是 Java 和 Kotlin 混编的,包括我们的项目在内也是如此。所以我们总是免不了 Java 和 Kotlin 互调的情况。...代表它们可以为空,然后为它们赋值为 null。实际上,我们在使用中一点都不希望它们为空。这样造成的后果就是,我们每次要使用它的时候都必须去先判断它不为空。这样无用的代码,无疑是浪费了我们的工作时间。...7 注意 Kotlin 的可空和不可空 最近闹了一个笑话,在项目中需要写一个上传跳绳数据的功能。于是有了下面的代码。...但由于某些原因,当我把上面的 ISkipService 类修改为了 Kotlin 实现,却发生了崩溃,从代码上暂时没看出问题。
对于上面的非空串与可空串,在Kotlin中每个类型的变量都分作不可为空和可以为空两种,就是非空串和可空串,正常的声明变量默认都是非空串(不可为null),比如下面的这个代码: 3.2 声明可空变量 var...3.3 校验空值的运算符 Kotlin在访问空串的length属性会抛出空指针异常,可以加个标记,告诉编译器遇到空指针别抛异常,直接返回空指针就可以了,对应的代码如下: var strB:String?...表示不做非空判断,强制执行后面的表达式,如果变量为空,就会抛出异常 //所以只有在确保为非空时,才能使用!!...最后来总结一下吧: (1)声明变量示例时,在类型名称后面加问号,表示该变量可以为空。 (2)调用变量方法时,在变量名称后面加问号,表示一旦变量为空就返回null。 (3)新引入运算符“?...is 在Kotlin中,若要校验变量是否为某种类型,使用的关键字是is,具体写法形如“变量名称 is 类型名称”;若要校验变量是否不为某种类型,使用的关键字时 !is形如“变量名称 !
领取专属 10元无门槛券
手把手带您无忧上云