
寫在前面:Kotlin介紹
1、Kotlin是什么?
在正式搭建環(huán)境之前,我想有必要先和大家介紹下Kotlin,以免第一次接觸的同學(xué)一頭霧水不知道我在說什么。
Kotlin是由JetBrains創(chuàng)建的基于JVM的編程語言,我們眾所周知的Android Studio 是基于IntelliJ修改而來的,而IntelliJ正是JetBrains的杰作。Kotlin是一門包含很多函數(shù)式編程思想的面向?qū)ο缶幊陶Z言,它正成長為Android開發(fā)中用于替代Java的語言。
我們都知道Java是世界上使用最多的編程語言之一,Java缺失的很多特性在最新的修訂版中也逐漸覆蓋到了,但Android開發(fā)者暫時還沒能夠使用它們,這就使得類似 Kotlin 這樣的語言有了用武之地了:在舊的開發(fā)環(huán)境中使用現(xiàn)代語言的特性。
2、Kotlin的特性有哪些?
使用kotlin開發(fā)android的好處太多了,它簡單、易用、代碼量少。有人說代碼量減少3倍,別不信,這并不夸張,當代碼量越大的時候我們就越會發(fā)現(xiàn)這一點。事實上,Kotlin生來就是為了彌補Java缺失的現(xiàn)代語言的特性的,并極大的簡化了代碼,使得開發(fā)者可以編寫盡量少的樣板代碼。
- 簡潔——大大減少您需要編寫的樣板代碼量
使用一行代碼創(chuàng)建一個包含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開發(fā)程序中最常見的崩潰了,因為在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實現(xiàn)而言,簡直是一行代碼搞定的,不過以上代碼是無法編譯通過的,因為user是可能為空的,而user沒對空情況做處理,所以無法編譯。解決方式有兩種:
- 第一種對字段進行空情況做處理,則可安全調(diào)用
if(user != null){
toast(user.name)
}
- 第二種利用安全調(diào)用操作符,只有在user不為空時會調(diào)用user.name
toast (user?.name)
多用途——支持多種類型的應(yīng)用程序
Android開發(fā)。
沒有性能影響。運行時非常小。服務(wù)器應(yīng)用 100%兼容所有JVM框架。
JavaScript 在Kotlin中編寫代碼,并轉(zhuǎn)換為 JavaScrip 在 Node.js 或瀏覽器中運行。企業(yè)
使用Kotlin進行任何類型的企業(yè)Java EE開發(fā)。網(wǎng)頁
無論您是要強制類型的HTML,CSS構(gòu)建器還是簡單的Web開發(fā)。其他所有(ios、嵌入式等等)
Kotlin在2017年4月份推出了預(yù)覽版,并在在官方博客中描述了對 Kotlin 的美好愿景。可互操作——100%兼容 Java 從而可利用已有代碼及 JVM 類庫
Kotlin和Java都屬于基于JVM的編程語言,Kotlin和Java的交互性很好,可以說是無縫連接,這表現(xiàn)在:Kotlin 可以自由的引用 Java 的代碼,反之亦然
Kotlin 可以使用現(xiàn)有的全部的 Java 框架和庫
Java 文件可以很輕松的借助 IntelliJ 的插件轉(zhuǎn)成 kotlin
多工具支持——自由選擇命令行編譯器或一級IDE支持
Kotlin目前提供了四種編寫方式:命令行編譯工具
在線編輯 Try Kotlin
Android Studio、Eclipse
IntelliJ IDEA
其中 IntelliJ IDEA 提供了對 Kotlin 最新功能的支持,也是 Kotlin 最智能的編輯器。
至于Kotlin是什么,簡單的說就是跑在jvm上的新語言,他的特點就是短小、快,至于更加具體的特性和細節(jié),比如:擴展函數(shù)、函數(shù)式(Lambdas)、Kotlin Android Extention等我們會在后文中提到,敬請關(guān)注。
一分鐘:環(huán)境搭建
-
首先 你要有一個Android Studio
如果你仍然在使用Eclipse,為了跟上本教程的步伐,恐怕你需要轉(zhuǎn)移到Android Studio了。Kotlin團隊也創(chuàng)建了一個針對 Eclipse的插件,但是它是遠遠落后于Android Studio的,而且結(jié)合得也并不完美。而你一旦在Android Studio使用了它,你就會覺得相見恨晚。
我現(xiàn)在正在用的是2.3.3版本,而想要在這一版的AS上進行進行Kotlin開發(fā)是需要安裝插件的,如果你不想,你也可以到這里“成為搶先體驗者”下載預(yù)覽版,這里自帶插件。
Android Studio Preview登陸界面 -
其次 安裝一個Kotlin的插件
依次打開:File -> Settings... -> Plugins,然后選擇底部Browse repositories,在搜索框中搜索“Kotlin”,結(jié)果列表中的“Kotlin”插件就是我們要找的目標了。
Kotlin插件
點擊安裝,安裝完成之后,重啟Android Studio就可以了。 -
新建工程
重新打開Android Studio,新建一個Android項目“MyFirstKotlin” ,添加一個默認的MainActivity,像之前我們所說的一樣即可,只不過這里要新勾選一下“Include Kotlin Support”這個選項。
Create New Project Java to Kotlin 代碼轉(zhuǎn)換
安裝完插件的 Android Studio 就已經(jīng)擁有開發(fā) Kotlin 的能力了,那么如何體現(xiàn)這個能力呢?我們先來嘗試它的轉(zhuǎn)換功能:可以把現(xiàn)有的java文件翻譯成Kotlin文件。
打開MainActivity文件,在Code菜單下面可以看到一個新的功能:“Convert Java File to Kotlin File”,我們嘗試一下,效果是這樣的:
- 轉(zhuǎn)換前的MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
- 轉(zhuǎn)換后的MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Kotlin的轉(zhuǎn)換功能對于新手不知道怎么寫Kotlin代碼是比較實用的,但是這個功能僅僅就是“逐字逐句”的把Java翻譯成Kotlin而已,想要發(fā)揮出Kotlin的威力則是不可能的,尤其是代碼很長的時候,你會發(fā)現(xiàn)這種機械式的翻譯并不能給代碼減肥多少,尤其是在initView()的過程中產(chǎn)生的大量的“!!”更是限制了Kotlin的自由,所以學(xué)習(xí)Kotlin并在工程中直接編寫 Kotlin 代碼是必不可少的!
二分鐘:配置gradle文件
MainActivity.java已經(jīng)被轉(zhuǎn)換成了Kotlin代碼,但是該項目目前還不可以用,還需要配置一下Gradle,添加相關(guān)的依賴等才能正常編譯、運行。
當然了,我們也可以在java轉(zhuǎn)換成Kotlin之后,在打開MainActivity.kt文件時,點擊編譯器上方提示的"Kotlin not configured",Android Studio就會自動幫我們做好了相關(guān)配置!不過這對我們理解整個Kotlin工程是沒有幫助的,并且我們以后想要對Gradle做出自己的配置也必須對Kotlin的相關(guān)依賴有所了解,所以有必要手動配置一下,以此保持我們對Gradle文件讀寫的控制權(quán),否則它只會變得混亂而不會變得簡單。
- 配置后的項目的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的一個依賴,并且根據(jù)上面定義的變量自動依賴相應(yīng)的版本。
- 配置后的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任務(wù)的很強大的Kotlin庫。我們之后將會學(xué)習(xí)部分anko,但是現(xiàn)在來說僅僅增加anko-common就足夠了,這個庫被分割成了一系列小的部分以至于我們不會把沒用到的部分加進來。
jcenter是Android項目的一個聲明倉庫的源,之前版本則是mavenCentral(), jcenter可以理解成是一個新的中央遠程倉庫,兼容maven中心倉庫,而且性能更優(yōu),我們在依賴里定義的內(nèi)容就是到這個庫里去拿相關(guān)工程的代碼和資源文件的。
這時,我們點擊“Sync”把工程同步一下,然后進行下一步。
三分鐘:代碼編寫與運行
我現(xiàn)在暫時不對這些代碼做解釋,但是我想要確保它們在我們的環(huán)境中是正常運行的,這可能是配置中最難的一部分。
- 首先,打開activity_main.xml,然后設(shè)置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,編譯器將會把它轉(zhuǎn)換成一般的Java代碼,所以這樣使用是沒有任何性能開銷的。
現(xiàn)在運行這個app,如果沒有問題的話它是能夠正常運行的。
可能遇到的坑和解決方案
Kotlin版本不對導(dǎo)致Sync同步錯誤
此時你可能不知道應(yīng)該對應(yīng)哪個版本,這時你可以到剛才安裝插件的地方看一下你安裝的是哪個版本(你和我安裝的很可能不一樣),然后把Gradle文件(項目的build.gradle文件)中對應(yīng)的Kotlin改成你對應(yīng)安裝的版本就可以了。SSL peer shut down incorrectly
這個問題通常出現(xiàn)在Android Studio更新失敗的時候,原因是download:“gradle:3.0.0-alpha3”的時候,這個網(wǎng)站被我們偉大的墻給墻掉了,所以我們可以通過翻墻的方式來實現(xiàn)更新包的下載,但這并不是我們提倡的方法,更何況網(wǎng)上找到的可訪問的hosts多半用不長久,所以我們采用下載Gradle到本地的方法來解決該問題。
方法也很簡單,就是到這里“Gradle distributions”下載對應(yīng)版本的Gradle,下載完成后將解壓得到的文件夾放入Android Studio安裝根目錄的gradle文件夾,然后到“Settings...”里面做相應(yīng)的配置即可。

這時我們的第一個Kotlin應(yīng)用程序就運行完畢了,接下來會詳細介紹Kotlin使用,敬請關(guān)注!


