Android KTX

Android KTX是Google官方推荐的一套便利的Android API扩展函数库。因还处于beta阶段,相关API并不丰富,但既然是出自JakeWharton大神之手,必然是前途无限的。其目前提供了如下的API:

Kotlin 扩展特性

  1. Android KTX能扩充Android API得益于Kotlin扩展函数的特性,即能在不改变现有类的前提下,扩展这个类的功能,如增加属性或方法。
  2. 从语法上来看,Kotlin扩展函数与普通方法的区别是函数名前多了接收者类型的前缀
    如下Android KTX中对String的扩展:

    inline fun String.htmlEncode(): String = TextUtils.htmlEncode(this)
  3. 实现原理:Kotlin扩展函数实质上就是一个静态方法,本文就从代码上去寻找答案:
    首先,上述String.htmlEncode这个扩展函数其等效的java如下,特点是有一个扩展函数前缀类型的参数

    public final class StringKt {@NotNullpublic static final String htmlEncode(@NotNull String $receiver) {Intrinsics.checkParameterIsNotNull($receiver, "$receiver");String var10000 = TextUtils.htmlEncode($receiver);Intrinsics.checkExpressionValueIsNotNull(var10000, "TextUtils.htmlEncode(this)");return var10000;}
    }

    其次,测试htmlEncode方法:

    fun testHtmlEncode() {val str = """<> & " '""".htmlEncode()print(str)
    }

    接着,testHtmlEncode对应的java代码如下,出乎意料的是这段代码并不是调用StringKt.htmlEncode,而是以内联的方式潜入代码。

    public final void testHtmlEncode() {String $receiver$iv = "<> & \" '";String var10000 = TextUtils.htmlEncode($receiver$iv);Intrinsics.checkExpressionValueIsNotNull(var10000, "TextUtils.htmlEncode(this)");String str = var10000;System.out.print(str);
    }

    最后,排除原因是这个扩展函数声明为inline,去除这个关键字就是普通的静态方法调用。如下:

    public final void testhtmlEncode() {String str = StringKt .htmlEncode("<> & \" '");System.out.print(str);
    }

Kotlin Android Extensions

Kotlin Android Extensions是Kotlin官方推出的简化Android开发的Gradle插件,目前主要针对如下几种场景:

  • View Binding:即UI绑定,不需要再依赖其它library(如butterknife),即可实现UI绑定
  • View Caching:UI缓存,内置已实现了UI的缓存策略
  • Parcelable:使用注解即可实现Android的Parcelable序列化

工作原理:Kotlin Android Extensions这个插件使用了自动代码生成的方式,自动帮使用者实现UI绑定以及缓存机制

  1. layout如下:

    <TextViewandroid:id="@+id/completionRateView"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="11.5%"android:textColor="@color/text_blue"/>
  2. 设置文本:

    fun test() {completionRateView.text = "100%"
    }
  3. 反编译后代码如下,可以发现其实是调用了本类中的_findCachedViewById方法

    fun test() {TextView var10000 = (TextView)this._$_findCachedViewById(id.completionRateView);Intrinsics.checkExpressionValueIsNotNull(var10000, "completionRateView");var10000.setText((CharSequence)"100%");
    }
  4. _findCachedViewById方法如下,使用了HashMap进行缓存View,流程是:先取缓存,无缓存则调用findViewById

    public View _$_findCachedViewById(int var1) {if(this._$_findViewCache == null) {this._$_findViewCache = new HashMap();}View var2 = (View)this._$_findViewCache.get(Integer.valueOf(var1));if(var2 == null) {var2 = this.findViewById(var1);this._$_findViewCache.put(Integer.valueOf(var1), var2);}return var2;
    }
  5. 另外,其缓存策略还包括如下的清除方法:

  6. 小结:Kotlin Android Extensions并非直接为UI组件(Activity或Fragment)生成上述可以直接调用的属性,而只是在代码编译直接自动实现了UI的绑定。

    public void _$_clearFindViewByIdCache() {if(this._$_findViewCache != null) {this._$_findViewCache.clear();}}

KTX

  1. 经过上述两小节内容,基本弄清楚了Kotlin扩展函数和Kotlin Android Extensions的原理,再来看Android KTX,它实际上就是一套与Android API相关的扩展函数的集合。
  2. 借助于Kotlin扩展函数的特性,Android KTX能实现一套不需修改现有的Android API的代码即可为其实现扩展。
  3. Android KTX好处就是简化Android代码的编写。
  4. 至此Android KTX与Kotlin Android Extensions区别已很明显,但它们的目的是一致的:more concise, pleasant, and idiomatic

Android KTX与Kotlin Android Extensions相关推荐

  1. Android KTX 和 Kotlin android extension对比

    参考: KTX 和 Kotlin android extension 都到底是个啥? Android KTX KTX 是被称为Android之光的 JakeWharton 写的 Android KTX ...

  2. 【翻译】ANDROID KTX – 使用Kotlin进行Android开发

    原文地址:ANDROID KTX – ANDROID DEVELOPMENT WITH KOTLIN [正在翻译中] 介绍 Android KTX is an open source library ...

  3. KTX 和 Kotlin android extension 都到底是个啥?

    1. KTX是什么 Android官网对于KTX的介绍:https://developer.android.com/kotlin/ktx KTX 是被称为Android之光的 JakeWharton  ...

  4. kotlin android获取按钮,Kotlin Android按钮

    Android Button是用于在单击时执行事件的按钮.它是android.widget.Button类下的一个UI组件.要了解有关Android Button的更多信息, 请参阅Android B ...

  5. 隆重推出:Android KTX 预览版让 Kotlin 代码更精简

    最近逛官网发现Android KTX ,Android KTX 是一套扩展插件.它能帮助开发者更为简洁.通顺和优雅地使用 Kotlin 语言开发 Android 应用.目前版本0.2,Google 表 ...

  6. Google发布Android KTX预览版

    前天,Google 发布了 Android KTX 预览版,Android KTX 是一组扩展程序,它能使 Android 上的 Kotlin 代码更简洁,从而提高开发者的编程体验. 大家知道,Goo ...

  7. kotlin学习笔记——Kotlin Android Extensions

    Kotlin Android Extensions是另外一个团队开发的,它是一个插件所以不需要依赖别的库.当前仅仅包含view的绑定,会自动创建很多属性让我们直接访问xml中的view,我们就不需要明 ...

  8. 【译】迁移被废弃的Kotlin Android Extensions插件

    原文:Migrating the deprecated Kotlin Android Extensions compiler plugin 作者:Ahmad El-Melegy 在Kotlin 1.4 ...

  9. Kotlin Android Extensions使用指南

    Kotlin Android Extensions是Kotlin团队开发的一个插件,目的是让我们在开发过程中更少的编写代码.目前包括了视图绑定的功能. 几种绑定视图方式对比** xml文件如下 < ...

最新文章

  1. ssl 接收到一个超出最大准许长度的记录_我所经历的一次Dubbo服务雪崩,这是一个漫长的故事...
  2. 微软苹果服务器宕机,苹果服务器宕机,iPhone用户别做这两项操作,微软特斯拉也中招...
  3. onethink的熟悉
  4. C语言数组知识体系整理大学霸IT达人
  5. python文件不存在时创建文件_python-创建一个文件(如果不存在)
  6. Vue指令篇_v-for_列表渲染
  7. 大学最难的课是哪一门课?
  8. Qt之QFileSystemWatcher
  9. 腾讯终于有动作了:国行版Switch快来了...
  10. codevs1197 Vigenère密码
  11. 设计模式(3)--SimpleFactory( [1] 简单工厂模式)--创建型
  12. CodeWithMosh--mysql 学习笔记(4) -- 相关数据类型
  13. 响应式编程优点 有效_美团 EasyReact 源码剖析:图论与响应式编程
  14. 202007219 Oracle建表语句
  15. 函数论_E.C.Tichmarsh_Page 4 级数一致收敛的魏尔斯特拉斯 M-判别法 的推广
  16. 代码覆盖率和功能覆盖率
  17. numpy的array_equal函数
  18. ”凌寒独自开“绽放不一样的自己
  19. Java程序性能优化 !
  20. Treehouse CEO Ryan Carson:如何快速招到优秀的员工?

热门文章

  1. UGC发垃圾机制和内容审核
  2. c语言0的作用是什么意思,C语言 1 0 是什么意思
  3. 考勤系统 人员排班设置
  4. 如何将RT-Thread移植到织女星开发板?
  5. 适合计算机社团活动的游戏,活跃气氛的70个小游戏 适合集体活动的趣味游戏
  6. Python中的 if __name__ == __main__到底是个啥意思?
  7. Linux sed识别HTML标签
  8. 电子学会 青少年软件编程等级考试 C语言 3 级
  9. word2019文档中输入空格变成省略号圆点正方形空白框去除方法
  10. 【CSS】渐变背景(background-image)