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

奔跑的少女.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(一)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,117評論 25 708
  • 前言 人生苦多,快來 Kotlin ,快速學習Kotlin! 什么是Kotlin? Kotlin 是種靜態類型編程...
    任半生囂狂閱讀 26,267評論 9 118
  • 懶得處理樣式了, 將就著看吧. 官網地址: https://developer.android.com/topic...
    Reddington_604e閱讀 1,694評論 0 1
  • 若浮其生,緩步而行,紛擾流年,且吟且行。美好不在別處,而在心里,心安是歸處。 愿你獨立懂得溫暖,善良...
    醇希閱讀 376評論 0 0
  • 從小就是一個懂事的孩子,長大后并沒有覺得這是一個褒義詞用來表揚我,只是這個懂事成了我前行的負擔。 ...
    小希妹妹閱讀 459評論 0 1