5.1 三分钟开启第一个 Kotlin 工程

写在前面:Kotlin介绍

1、Kotlin是什么?

在正式搭建环境之前,我想有必要先和大家介绍下Kotlin,以免第一次接触的同学一头雾水不知道我在说什么。

Kotlin是由JetBrains创建的基于JVM的编程语言,我们众所周知的Android Studio 是基于IntelliJ修改而来的,而IntelliJ正是JetBrains的杰作。Kotlin是一门包含很多函数式编程思想的面向对象编程语言,它正成长为Android开发中用于替代Java的语言。

我们都知道Java是世界上使用最多的编程语言之一,Java缺失的很多特性在最新的修订版中也逐渐覆盖到了,但Android开发者暂时还没能够使用它们,这就使得类似 Kotlin 这样的语言有了用武之地了:在旧的开发环境中使用现代语言的特性。

2、Kotlin的特性有哪些?

使用kotlin开发android的好处太多了,它简单、易用、代码量少。有人说代码量减少3倍,别不信,这并不夸张,当代码量越大的时候我们就越会发现这一点。事实上,Kotlin生来就是为了弥补Java缺失的现代语言的特性的,并极大的简化了代码,使得开发者可以编写尽量少的样板代码。

  • 简洁——大大减少您需要编写的样板代码量
    使用一行代码创建一个包含getter,setter并重写equals(),hashCode(),toString(),copy()等方法的POJO(Plain Ordinary Java Object <简单的Java对象>):
data class Customer(val name: String, val email: String, val company: String)
  • 安全——避免整个类的错误,如空指针异常
    空指针(NullPointerException)是我们使用Java开发程序中最常见的崩溃了,因为在Java中我们不得不写很多防御性的代码,比如这样:
public void test(String string) {
    if (string != null) {
        char[] chars = string.toCharArray();
        if (chars.length > 10) {
            System.out.println(((Character)chars[10]).hashCode());
        }
    }
}

在Kotlin中空指针异常得到了很好的解决:

val user: User? = null
toast(user.name)

而且相对Java实现而言,简直是一行代码搞定的,不过以上代码是无法编译通过的,因为user是可能为空的,而user没对空情况做处理,所以无法编译。解决方式有两种:

  • 第一种对字段进行空情况做处理,则可安全调用
if(user != null){
    toast(user.name)
}
  • 第二种利用安全调用操作符,只有在user不为空时会调用user.name
toast (user?.name)
  • 多用途——支持多种类型的应用程序

  • Android开发。
    没有性能影响。运行时非常小。

  • 服务器应用 100%兼容所有JVM框架。
    JavaScript 在Kotlin中编写代码,并转换为 JavaScrip 在 Node.js 或浏览器中运行。

  • 企业
    使用Kotlin进行任何类型的企业Java EE开发。

  • 网页
    无论您是要强制类型的HTML,CSS构建器还是简单的Web开发。

  • 其他所有(ios、嵌入式等等)
    Kotlin在2017年4月份推出了预览版,并在在官方博客中描述了对 Kotlin 的美好愿景。

  • 可互操作——100%兼容 Java 从而可利用已有代码及 JVM 类库
    Kotlin和Java都属于基于JVM的编程语言,Kotlin和Java的交互性很好,可以说是无缝连接,这表现在:

  • Kotlin 可以自由的引用 Java 的代码,反之亦然

  • Kotlin 可以使用现有的全部的 Java 框架和库

  • Java 文件可以很轻松的借助 IntelliJ 的插件转成 kotlin

  • 多工具支持——自由选择命令行编译器或一级IDE支持
    Kotlin目前提供了四种编写方式:

  • 命令行编译工具

  • 在线编辑 Try Kotlin

  • Android Studio、Eclipse

  • IntelliJ IDEA
    其中 IntelliJ IDEA 提供了对 Kotlin 最新功能的支持,也是 Kotlin 最智能的编辑器。

至于Kotlin是什么,简单的说就是跑在jvm上的新语言,他的特点就是短小、快,至于更加具体的特性和细节,比如:扩展函数、函数式(Lambdas)、Kotlin Android Extention等我们会在后文中提到,敬请关注。

一分钟:环境搭建

  • 首先 你要有一个Android Studio
    如果你仍然在使用Eclipse,为了跟上本教程的步伐,恐怕你需要转移到Android Studio了。Kotlin团队也创建了一个针对 Eclipse的插件,但是它是远远落后于Android Studio的,而且结合得也并不完美。而你一旦在Android Studio使用了它,你就会觉得相见恨晚。
    我现在正在用的是2.3.3版本,而想要在这一版的AS上进行进行Kotlin开发是需要安装插件的,如果你不想,你也可以到这里“成为抢先体验者”下载预览版,这里自带插件。

    Android Studio Preview登陆界面

  • 其次 安装一个Kotlin的插件
    依次打开:File -> Settings... -> Plugins,然后选择底部Browse repositories,在搜索框中搜索“Kotlin”,结果列表中的“Kotlin”插件就是我们要找的目标了。

    Kotlin插件

    点击安装,安装完成之后,重启Android Studio就可以了。

  • 新建工程
    重新打开Android Studio,新建一个Android项目“MyFirstKotlin” ,添加一个默认的MainActivity,像之前我们所说的一样即可,只不过这里要新勾选一下“Include Kotlin Support”这个选项。


    Create New Project
  • Java to Kotlin 代码转换
    安装完插件的 Android Studio 就已经拥有开发 Kotlin 的能力了,那么如何体现这个能力呢?我们先来尝试它的转换功能:可以把现有的java文件翻译成Kotlin文件。

打开MainActivity文件,在Code菜单下面可以看到一个新的功能:“Convert Java File to Kotlin File”,我们尝试一下,效果是这样的:

  • 转换前的MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 转换后的MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Kotlin的转换功能对于新手不知道怎么写Kotlin代码是比较实用的,但是这个功能仅仅就是“逐字逐句”的把Java翻译成Kotlin而已,想要发挥出Kotlin的威力则是不可能的,尤其是代码很长的时候,你会发现这种机械式的翻译并不能给代码减肥多少,尤其是在initView()的过程中产生的大量的“!!”更是限制了Kotlin的自由,所以学习Kotlin并在工程中直接编写 Kotlin 代码是必不可少的!

二分钟:配置gradle文件

MainActivity.java已经被转换成了Kotlin代码,但是该项目目前还不可以用,还需要配置一下Gradle,添加相关的依赖等才能正常编译、运行。

当然了,我们也可以在java转换成Kotlin之后,在打开MainActivity.kt文件时,点击编译器上方提示的"Kotlin not configured",Android Studio就会自动帮我们做好了相关配置!不过这对我们理解整个Kotlin工程是没有帮助的,并且我们以后想要对Gradle做出自己的配置也必须对Kotlin的相关依赖有所了解,所以有必要手动配置一下,以此保持我们对Gradle文件读写的控制权,否则它只会变得混乱而不会变得简单。

  • 配置后的项目的build.gradle文件
buildscript {
    ext.kotlin_version = '1.1.2-4'
    ext.support_version = '23.1.1'
    ext.anko_version = '0.10.1'
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

相比与之前的文件,增加的就只有这么几行:

buildscript {
    ext.kotlin_version = '1.1.2-4'    // 1
    ext.support_version = '23.1.1'  // 2
    ext.anko_version = '0.10.1'      // 3
    dependencies { 
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"  // 4
    }
}

注释1、2、3相当于定义了一个全局变量,在诸如注释4的地方会用到,在模块的build.gradle中也会得到使用,稍后介绍。这里的注释4定义了kotlin的一个依赖,并且根据上面定义的变量自动依赖相应的版本。

  • 配置后的Module里的build.gradle文件:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
    ...
}
dependencies {
    compile "com.android.support:appcompat-v7:$support_version"
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.anko:anko-common:$anko_version"
}
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}

我们增加的就这么几行:

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
dependencies {
    compile "com.android.support:appcompat-v7:$support_version"
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.anko:anko-common:$anko_version"
}

可以看到,我们增加了Kotlin标准库、Anko库,以及Kotlin和Kotlin Android Extensions plugin插件到dependencies。

这里说一下Anko和jcenter:
Anko是一个用来简化一些Android任务的很强大的Kotlin库。我们之后将会学习部分anko,但是现在来说仅仅增加anko-common就足够了,这个库被分割成了一系列小的部分以至于我们不会把没用到的部分加进来。
jcenter是Android项目的一个声明仓库的源,之前版本则是mavenCentral(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优,我们在依赖里定义的内容就是到这个库里去拿相关工程的代码和资源文件的。

这时,我们点击“Sync”把工程同步一下,然后进行下一步。

三分钟:代码编写与运行

我现在暂时不对这些代码做解释,但是我想要确保它们在我们的环境中是正常运行的,这可能是配置中最难的一部分。

  • 首先,打开activity_main.xml,然后设置TextView的id:
<TextView
    android:id="@+id/message"
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
  • 然后,手动在Activity中增加一个import语句:
import kotlinx.android.synthetic.main.activity_main.*
  • 在onCreate()中直接得到并访问这个TextView:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    message.text = "Hello Kotlin!"
}

Kotlin和Java之间是可以互操作的,我们可以在Kotlin中像操作属性一样去操作Java库中的getter、setter方法。就像这里我们可以使用message.text来代替message.setText,编译器将会把它转换成一般的Java代码,所以这样使用是没有任何性能开销的。

现在运行这个app,如果没有问题的话它是能够正常运行的。

可能遇到的坑和解决方案

  • Kotlin版本不对导致Sync同步错误
    此时你可能不知道应该对应哪个版本,这时你可以到刚才安装插件的地方看一下你安装的是哪个版本(你和我安装的很可能不一样),然后把Gradle文件(项目的build.gradle文件)中对应的Kotlin改成你对应安装的版本就可以了。

  • SSL peer shut down incorrectly
    这个问题通常出现在Android Studio更新失败的时候,原因是download:“gradle:3.0.0-alpha3”的时候,这个网站被我们伟大的墙给墙掉了,所以我们可以通过翻墙的方式来实现更新包的下载,但这并不是我们提倡的方法,更何况网上找到的可访问的hosts多半用不长久,所以我们采用下载Gradle到本地的方法来解决该问题。

方法也很简单,就是到这里“Gradle distributions”下载对应版本的Gradle,下载完成后将解压得到的文件夹放入Android Studio安装根目录的gradle文件夹,然后到“Settings...”里面做相应的配置即可。

“Settings...”里相应的配置

这时我们的第一个Kotlin应用程序就运行完毕了,接下来会详细介绍Kotlin使用,敬请关注!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容