本章会分为以下内容:

1.Kotlin KAE介绍,使用和原始Android findViewById对比优缺点

2.Kotlin KAE所存在的问题

3.通过字节码分析他的实现原理

阅读本章内容大概需要您5分钟的时间

一、Kotlin KAE介绍,使用和原始Android findViewById对比优缺点

说起Koltin大家可能不陌生,Android的小伙伴,谷歌Android的一级语言,国内虽然还不算太流行,不过也慢慢火了起来,今天就来说一下Kotlin的一个扩展插件 kotlin-android-extensions , 简称KAE ,

官方文档 http://kotlinlang.org/docs/tutorials/android-plugin.html

1.1 KAE的使用

如果你的AndroidStudio版本比较低,那么你需要去在AndroidStudio里面下载Kotlin的支持,这里不讲述了(Google一下~)

我们就说一下版本比较高的AndroidStudio怎么使用KAE , 我们创建一个项目之后,我们需要在Project的Gradle里面添加上我们的 buildscript里添加上support_version字段 然后再我们的模块Gradle中plugin我们的AKE 具体见下图

这时候我们的KAE就算安装完毕了

关于使用:

在我们原来View绑定XML控件的时候,我们通常会做findViewById(R.id.xx)的工作,这是很头疼的事情,界面简单还好说,如果界面复杂,你会遇到下面这种事情

一大串的findViewById, 用插件生成还好说,手动写就很头疼,第一它样板代码,第二他太多了太多了太多了!,如果要写成全局的控件,上面还要写一份,就是双倍了有木有,但是我们使用KAE的话 就是如下的样子

有的小伙伴可能就会问了,findViewById呢,去哪了? 其实KAE帮我们做了这个事情,下面在字节码分析会讲到他是怎么做的,这里我们想使用控件,直接引入一个包就可以了,这个包并不是实际存在的,

这个包会直接绑定上我们的试图中所有的控件,怎么样,代码是不是简洁了很多。我们就可以节省更多的时间不去写findViewById了,把更多的时间用在控件的逻辑交互上,节省了开发时间。

二.Kotlin KAE所存在的问题

当我们的界面比较复杂,比如说我们想给ListView加一个Header的时候,我们可能要引入另一个View,当两个View控件id一样的时候,我们就会出现一个问题,如下图

也就是说,不同xml布局文件id相同的控件用在一个Acitivity中 会引起歧义,这时候我们可以通过别名(外号)的方式解决冲突在我们引包的地方加上个别名即可

但是解决问题的根源就是预防问题,所以当我们写id的时候还需要严谨一些!

三、通过字节码分析他的实现原理

我们就还是继续上面的代码来进行查看一下生成的字节码,生成的字节码我放在下面供大家参考

package github.nixo.com.github.Common.View;import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import github.nixo.com.github.Common.Present.LoginPersenter;
import github.nixo.com.github.R.id;
import github.nixo.com.github.mvp.Impl.BaseActivity;
import java.util.HashMap;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;@Metadata(mv = {1, 1, 11},bv = {1, 0, 2},k = 1,d1 = {"\u0000&\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\u0003\n\u0002\b\u0005\u0018\u00002\b\u0012\u0004\u0012\u00020\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0003J\u0012\u0010\u0004\u001a\u00020\u00052\b\u0010\u0006\u001a\u0004\u0018\u00010\u0007H\u0016J\b\u0010\b\u001a\u00020\u0005H\u0016J\u000e\u0010\t\u001a\u00020\u00052\u0006\u0010\n\u001a\u00020\u000bJ\u0006\u0010\f\u001a\u00020\u0005J\u0006\u0010\r\u001a\u00020\u0005J\u0012\u0010\u000e\u001a\u00020\u00052\b\u0010\u000f\u001a\u0004\u0018\u00010\u0007H\u0016¨\u0006\u0010"},d2 = {"Lgithub/nixo/com/github/Common/View/LoginActivity;", "Lgithub/nixo/com/github/mvp/Impl/BaseActivity;", "Lgithub/nixo/com/github/Common/Present/LoginPersenter;", "()V", "onCreate", "", "savedInstanceState", "Landroid/os/Bundle;", "onDestory", "onLoginError", "e", "", "onLoginStart", "onLoginSuccess", "onViewStateResotre", "saveInstanceState", "production sources for module app"}
)
public final class LoginActivity extends BaseActivity {private HashMap _$_findViewCache;public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(2131361819);((Button)this._$_findCachedViewById(id.login_login)).setOnClickListener((OnClickListener)(new OnClickListener() {public final void onClick(View it) {LoginPersenter var10000 = (LoginPersenter)LoginActivity.this.getPresenter();EditText var10001 = (EditText)LoginActivity.this._$_findCachedViewById(id.login_account);Intrinsics.checkExpressionValueIsNotNull(var10001, "login_account");String var2 = var10001.getText().toString();EditText var10002 = (EditText)LoginActivity.this._$_findCachedViewById(id.login_password);Intrinsics.checkExpressionValueIsNotNull(var10002, "login_password");var10000.doLogin(var2, var10002.getText().toString());}}));}public final void onLoginSuccess() {CharSequence message$iv = (CharSequence)"登陆成功";Toast var3 = Toast.makeText(this, message$iv, 0);var3.show();Intrinsics.checkExpressionValueIsNotNull(var3, "Toast\n        .makeText(…         show()\n        }");}public final void onLoginError(@NotNull Throwable e) {Intrinsics.checkParameterIsNotNull(e, "e");CharSequence message$iv = (CharSequence)"登陆失败";Toast var4 = Toast.makeText(this, message$iv, 0);var4.show();Intrinsics.checkExpressionValueIsNotNull(var4, "Toast\n        .makeText(…         show()\n        }");}public final void onLoginStart() {}public void onViewStateResotre(@Nullable Bundle saveInstanceState) {}public void onDestory() {}public View _$_findCachedViewById(int var1) {if (this._$_findViewCache == null) {this._$_findViewCache = new HashMap();}View var2 = (View)this._$_findViewCache.get(var1);if (var2 == null) {var2 = this.findViewById(var1);this._$_findViewCache.put(var1, var2);}return var2;}public void _$_clearFindViewByIdCache() {if (this._$_findViewCache != null) {this._$_findViewCache.clear();}}
}

我们首先找到我们的login_login控件,我们可以发现他也执行了findViewById,只不过是findCacheViewById,其实这里使用了HashMap作为控件缓存,我们看一下这两个方法,就是判断是否有这个缓存,如果用直接用,没有在调用findViewById,所以Kotlin的KAE 其实就是在编译时期将我们的控件执行了findViewById的操作,它只不过帮我们做了这件事,并且是编译时期调用,变为相同代码,原理跟ButterKinfe差不多,但是比ButterKinfe更简洁,而且使用KAE有一个好处,我们保证了类型的安全性,不会因为写错控件类型而导致强转错误~

以上就是本章的全部内容了,今天中秋节,祝大家中秋节快乐!

Android Kotlin 学习总结(一) 《KAE 优缺点并且深入字节码分析工作原理》相关推荐

  1. glibc-2.23学习笔记(二)—— free部分源码分析

    glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...

  2. glibc-2.23学习笔记(一)—— malloc部分源码分析

    glibc-2.23学习笔记(一)-- malloc部分源码分析 搭建Glibc源码调试环境 1.下载并解压glibc源码 2.配置gdb 3.编译测试程序 第一次调用 源码分析 __libc_mal ...

  3. activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask

    前言 承接上文<activiti学习(二十)--流程虚拟机源码分析(二)--从开始节点离开到下个节点前>,假设execution接下来进入的节点是userTask,本文分析一下进入user ...

  4. Android Kotlin学习笔记(一)—— Kotlin Koans

    文章目录 题记 1.资料阅读 2.辅助插件 3.习题演练 3.1 Introduction 1.Hello world 2.Java to Kotlin conversion 3.Named argu ...

  5. android 代码 drawable,Android Drawable完全解析(一):Drawable源码分析(中)

    呃...我不是故意要凑篇幅写个什么上下篇,实在是因为Drawable源码有点长,一篇写不下啦O(∩_∩)O~ 鉴于源码一般较长,以后所有源码分析的部分,英文注释非必要情况都不再保留! 2:Drawab ...

  6. Android AOP编程(五)——Gradle插件+TransformAPI+字节码插桩实战

    开篇 在前面几篇博文中,我记录了Android AOP编程的一些基础知识,包括Gradle插件的开发.TransformAPI的使用,以及一些操作字节码的工具如AspectJ,Javassist和AS ...

  7. 【电机学习笔记】第一章 了解交流电机的结构以及工作原理

    系列文章目录 第一章  了解交流电机的结构以及工作原理 文章目录 系列文章目录 文章目录 前言 一.交流电机的构成 二.同步与异步的区别 三. 交流电机的运动原理 前言         由于交流电力系 ...

  8. Android 12 新APP启动画面(SplashScreen API)简介源码分析

    以往的启动画面 默认情况下刚启动APP时会显示一会白色背景 如果把这个启动背景设置为null,则一闪而过的白色会变成黑色 如果把启动Activity设置为背景透明[< item name=&qu ...

  9. 《网安学习之道》第一季计算机基础07_交换机工作原理

    第七章交换机 一.定义 交换机(switch)是一种在通信系统中完成信息交换功能的设备. 二.交换机使用前---->集线器 1.在早期的计算机网络系统中,交换概念的提出是通过共享工作模式的改进. ...

最新文章

  1. 一次因NAS存储故障引起的Linux系统恢复案例
  2. 从事软件测试为什么要学自动化?
  3. SQL函数大全——实例
  4. Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义
  5. python抢红包脚本实例-这个Python脚本牛逼了,秒抢红包,再不怕错过一个亿了!...
  6. python怎么导入包-python怎样导入包
  7. 机器学习应用方向(三)~可解释机器学习Explainable ML/Explainable AI
  8. linux 中卸载提示设备正忙怎么办?
  9. usb管控软件_数据防泄密软件介绍
  10. WPF中Auto与*的区别
  11. 使用FactoryBean定制实例化逻辑
  12. Integer与int的比较与区别
  13. linux中存放着内核和引导程序的是,Linux操作系统 考试题库
  14. 冷启动阶段的多规则策略如何筛选?
  15. 为什么移动硬盘不建议插在台式机前置USB接口上?
  16. java实现12306查票_java爬取12306查询余票的操作
  17. 什么是GPU加速,如何使用GPU加速,GPU加速的缺点
  18. 与一名上海学生深度交流上大学的事
  19. 适用于编程开发自学的学习网站
  20. ANSYS中按照X坐标提取节点应力值

热门文章

  1. 搜索智能问答的探索与实践
  2. 智慧政务说明书 人事管理(七)
  3. cf排位显示服务器爆满,2021年《CF手游》究竟还有多少人在玩?取消模拟器排位影响大?...
  4. 计算机病毒与反病毒技术论文
  5. 当数字技术逐渐成熟,互联网开始有了许许多多创新性的改变
  6. 计算机办公软件应用三套题目,Office办公软件高级应用第三套试卷100分.doc
  7. 硬盘故障诊断软件mhdd使用详解
  8. python科学计算4
  9. joda-time介绍
  10. Java判断回文数(两种方式)