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官網