Android-KTX

介紹:這是一套用於Android應用開發的 Kotlin 擴展。目的就是為了讓我們使用 Kotlin 進行簡潔、愉悅、慣用地 Android 開發,而不會增加新的功能。

原理介紹

透過現象看本質,這樣使用起來就不會迷惑,而且遇到問題也能方便排查。

Android-ktx主要使用Kotlin語言的幾個特性,了解了這些特性後,我們自己也能很方便的進行封裝,這樣就形成了我們自己的類庫,便於自己技術的沉澱。

Extensions

上面的第一個例子,uri的封裝就是利用了這個,Kotlin的官方文檔也有介紹。

直接看源碼就行了。

inline fun String.toUri(): Uri = Uri.parse(this)

其實就是對String做了一個擴展,如果使用Java的就很容易理解,如下所示,這種方式在日常開發中也很容易見到。

public class StringUtil{
    public static Uri parse(String uriString) {
        return Uri.parse(uriString);
    }
}

Lambdas

第二個例子主要使用了Lambdas這個特性,Kotlin文檔在這裡

還是貼代碼,首先對SharedPreferences做了擴展,然後這個擴展函數的參數是一個閉包,當函數最後一個參數是閉包的時候,函數的括弧可以直接省略,然後在後面接上閉包就行了。

inline fun SharedPreferences.edit(action: SharedPreferences.Editor.() -> Unit) {
    val editor = edit()
    action(editor)
    editor.apply()
}

Default Arguments

這個特性上面的例子沒有,可以單獨列舉,如下所示。(官方文檔介紹)

也是就說,當一個函數中含有多個參數時候,不需要像Java中那樣,依次賦值,可以僅僅賦需要的即可,Java中常見的解決的方法是方法重載,挨個傳入默認值。

class ViewTest {
    private val context = InstrumentationRegistry.getContext()
    private val view = View(context)

    @Test
    fun updatePadding() {
        view.updatePadding(top = 10, right = 20)
        assertEquals(0, view.paddingLeft)
        assertEquals(10, view.paddingTop)
        assertEquals(20, view.paddingRight)
        assertEquals(0, view.paddingBottom)
    }
}

updatePadding方法定義。

fun View.updatePadding(
    @Px left: Int = paddingLeft,
    @Px top: Int = paddingTop,
    @Px right: Int = paddingRight,
    @Px bottom: Int = paddingBottom
    ) {
    setPadding(left, top, right, bottom)
}

對於默認參數,還可以這樣玩,比如在Java中,常見的有建造在模式,對每個參數進行賦值,然後創建一個對象,如果使用這種特性,不需要改變的值,可以直接用默認值表示,這樣在編碼的時候,就會顯得很簡潔。

優勢:

作為Android開發語言,kotlin本身就是一門非常簡潔的開發語言,而Android-KTX使得kotlin更加的簡潔,代碼更加的精簡。

我們可以看到官方給出的一組對比:

Kotlin:

val uri = Uri.parse(myUriString)

Kotlin with Android KTX:

val uri = myUriString.toUri()

Kotlin:

sharedPreferences.edit()
    .putBoolean("key", value)
    .apply()

Kotlin with Android KTX:

sharedPreferences.edit {
    putBoolean("key", value)
}

Kotlin:

val pathDifference = Path(myPath1).apply {
    op(myPath2, Path.Op.DIFFERENCE)
}

canvas.apply {
    val checkpoint = save()
    translate(0F, 100F)
    drawPath(pathDifference, myPaint)
    restoreToCount(checkpoint)
}

Kotlin with Android KTX:

val pathDifference = myPath1 - myPath2

canvas.withTranslation(y = 100F) {
    drawPath(pathDifference, myPaint)
}

Kotlin:

view.viewTreeObserver.addOnPreDrawListener(
    object : ViewTreeObserver.OnPreDrawListener {
        override fun onPreDraw(): Boolean {
            viewTreeObserver.removeOnPreDrawListener(this)
            actionToBeTriggered()
            return true
        }
    })

Kotlin with Android KTX:

view.doOnPreDraw {
    actionToBeTriggered()
}

非常明顯的可以看出,Android-KTX使得代碼更加的簡潔。

Android-KTX在Android框架和支持庫上提供了一個良好的API層,這使得代碼更加簡潔,Android-KTX中支持的Android框架的部分現在可在GitHub庫中找到,同時,Google承諾在即將到來的支持庫版本中提供涵蓋Android支持庫的Android-KTX其他部分。

注意:

這個庫並不是最終正式版本,可能會有API的規範性改動或者移除,打算用這個來實現一些項目的朋友也注意這一定,畢竟,第一個吃螃蟹的人是有風險的。

不過谷歌表示,現在的預覽版本只是一個開始,在接下來的幾個月里,他們會根據開發者的反饋和貢獻加入 API 進行迭代,當 API 穩定後,Google 會承諾 API 的兼容性,並計劃將 Android KTX 作為 Android 支持庫的一部分。

關於kotlin:

kotlin是一個由JetBrains開發,基於JVM的編程語言,與Java編程語言100%互通,並具備諸多Java尚不支持的新特性,適用於如今使用Java的所有環境,常用於編寫伺服器端代碼和Android應用。Kotlin還得到了谷歌的支持,已正式成為Android開發一級語言。作為一個簡潔的語言,Kotlin支持 lambda,支持閉包,能夠減少代碼量,提高我們的開發效率。

進入官網了解更多:kotlin官網