使用Kotlin高效地開發Android App(四)

Tony沈哲發表於2018-05-25
奔跑的少女.jpg

一. 運算子過載

在Kotlin的世界裡,我們可以過載算數運算子,包括一元運算子、二元運算子和複合賦值運算子。

使用operator修飾符來修飾特定函式名的函式,這些函式可以是成員函式也可以是擴充套件函式。

例如,在RxKotlin的disposable.kt中有這樣一個方法。

operator fun CompositeDisposable.plusAssign(disposable: Disposable) { 
add(disposable)
}複製程式碼

它滿足兩個條件:

  1. 使用operator進行修飾
  2. 使用了plusAssign作為函式名

所以可以過載複合運算子+= , 那如何使用它呢?

compositeDisposable += RxBus.get().register(PaySuccessEvent::class.java) { 
getServices()
}複製程式碼

它等價於下面的程式碼

compositeDisposable.add(    RxBus.get().register(PaySuccessEvent::class.java) { 
getServices()
})複製程式碼

我們會發現,過載了運算子之後程式碼會顯得更加簡潔和優雅。

二. 簡化的lambda表示式

使用Kotlin高效地開發Android App(一)中,曾經介紹過尾隨閉包,它可以算是一種簡化的lambda表示式。

對於UI控制元件的點選事件,可以檢視我同事的文章View.OnClickListener在Kotlin中的進化

由最初的Java版本

view.setOnClickListener(new View.OnClickListener() { 
@Override public void onClick(View v) {
v.setVisibility(View.VISIBLE);
...
}
});
複製程式碼

使用Kotlin不斷地進行簡化,最後變成:

view.setOnClickListener { 
it.visibility = View.VISIBLE ...
}複製程式碼

再舉一個RxJava的例子。

        Observable.just("just a test")                .subscribe(new Consumer<
String>
() {
@Override public void accept(String s) throws Exception {
System.out.println(s);

}
}, new Consumer<
Throwable>
() {
@Override public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();

}
});
複製程式碼

如果使用Java的lambda進行簡化,可以這樣寫。

        Observable.just("just a test")                .subscribe(s ->
{
System.out.println(s);

}, throwable ->
{
throwable.printStackTrace();

});
複製程式碼

同樣的程式碼,使用Kotlin來寫的話會更加簡單。

        Observable.just("just a test")                .subscribe(                        { 
System.out.println(it)
}, {
it.printStackTrace()
} )複製程式碼

三. String的處理

Java在使用String.format函式時,需要記住%d、%s等轉換符。Kotlin大概是參考了Groovy的語法吧,使用${變數名
}
即可,簡單方便。

同樣類似Groovy,Kotlin也有三個雙引號來表示多行文字的輸出。

例如:

        var jsonString: String = """            { 
"username":"tony", "password":"123456"
} """
println(jsonString)複製程式碼

執行結果:

            { 
"username":"tony", "password":"123456"
}複製程式碼

四. RxJava 和 LiveData、Lifecycle

LiveData和Lifecycle是Google在2017年新出的Android Architecture Components的中的一部分。

LiveData元件用於持有可觀測的資料,它掌握著元件的生命週期資訊,在元件出現活躍狀態時提供更新,一般用於建立響應式UI。

Lifecycle元件用於建立能夠感知自身生命週期、能夠基於自身狀態調整行為的activity和fragment。元件可以經歷多種狀態——初始化、已建立、已啟動、已恢復、已銷燬,在狀態發生改變時會呼叫生命週期方法來執行各種動作。

藉助Kotlin的擴充套件函式和RxJava的特性,以及參考了https://github.com/YvesCheung/LiveDataToRxJava這個庫。

我做了一個LiveData的擴充套件庫github地址:https://github.com/fengzhizi715/LiveDataExtension

主要功能:

  • 支援LiveData轉換成Observable、Flowable。通過LiveData增加的擴充套件函式toObservable()、toFlowable()實現。

  • 支援RxJava的Observable、Flowbale、Completable、Single、Maybe轉換成LiveData。通過它們的擴充套件函式toLiveData()實現。

  • 支援RxJava的Observable、Flowbale、Completable、Single、Maybe繫結Lifecycle。通過它們的擴充套件函式bindLifecycle()實現。

例如在LoginViewModel中,login()函式大致可能是這樣寫的,替換了之前使用的RxLifecycle。當然,使用RxLifecycle的作用也是為了避免記憶體洩露。由於在我們的App架構中已經使用了Android Architecture Components,所以可以考慮替換RxLifecycle。

    fun login(owner: LifecycleOwner): Observable<
LoginResponse>
{
val param = LoginParam() param.phoneNo = phoneNumber.value.toString() param.zoneCode = zoneCode param.validationCode = verificationCode.value.toString() return RetrofitManager.get() .apiService() .login(param) .compose(RxJavaUtils.observableToMain()) .bindLifecycle(owner)
}複製程式碼

總結

Kotlin許多簡化的寫法能夠帶來開發效率的提升,程式碼也會顯得更加整潔和優雅。

該系列的相關文章:

使用Kotlin高效地開發Android App(五)完結篇

使用Kotlin高效地開發Android App(三)

使用Kotlin高效地開發Android App(二)

使用Kotlin高效地開發Android App(一)


Java與Android技術棧:每週更新推送原創技術文章,歡迎掃描下方的公眾號二維碼並關注,期待與您的共同成長和進步。

使用Kotlin高效地開發Android App(四)

來源:https://juejin.im/post/5b076911f265da0de2575131

相關文章