使用Kotlin高效地开发Android App(四)

640?wx_fmt=jpeg


一. 运算符重载

在Kotlin的世界里,我们可以重载算数运算符,包括一元运算符、二元运算符和复合赋值运算符。

使用operator修饰符来修饰 特定函数名的函数,这些函数可以是成员函数也可以是扩展函数。

例如,在RxKotlin的disposable.kt中有这样一个方法。

 
  
  1. operator fun CompositeDisposable.plusAssign(disposable: Disposable) {

  2.    add(disposable)

  3. }

它满足两个条件:

  1. 使用operator进行修饰

  2. 使用了plusAssign作为函数名

所以可以重载复合运算符 += , 那如何使用它呢?

 
  
  1. compositeDisposable += RxBus.get().register(PaySuccessEvent::class.java) { getServices() }

它等价于下面的代码

 
  
  1. compositeDisposable.add(

  2.    RxBus.get().register(PaySuccessEvent::class.java) { getServices() }

  3. )

我们会发现,重载了运算符之后代码会显得更加简洁和优雅。

二. 简化的lambda表达式

使用Kotlin高效地开发Android App(一)中,曾经介绍过尾随闭包,它可以算是一种简化的lambda表达式。

对于UI控件的点击事件,可以查看我同事的文章View.OnClickListener在Kotlin中的进化(https://www.jianshu.com/p/5f77209abb9b)

由最初的Java版本

 
  
  1. view.setOnClickListener(new View.OnClickListener() {

  2.    @Override

  3.    public void onClick(View v) {

  4.        v.setVisibility(View.VISIBLE);

  5.        ...

  6.    }

  7. });

使用Kotlin不断地进行简化,最后变成:

 
  
  1. view.setOnClickListener {

  2.    it.visibility = View.VISIBLE

  3.    ...

  4. }

再举一个RxJava的例子。

 
  
  1.        Observable.just("just a test")

  2.                .subscribe(new Consumer<String>() {

  3.            @Override

  4.            public void accept(String s) throws Exception {

  5.                System.out.println(s);

  6.            }

  7.        }, new Consumer<Throwable>() {

  8.            @Override

  9.            public void accept(Throwable throwable) throws Exception {

  10.                throwable.printStackTrace();

  11.            }

  12.        });

如果使用Java的lambda进行简化,可以这样写。

 
  
  1.        Observable.just("just a test")

  2.                .subscribe(s -> {

  3.                    System.out.println(s);

  4.                }, throwable -> {

  5.                    throwable.printStackTrace();

  6.                });

同样的代码,使用Kotlin来写的话会更加简单。

 
  
  1.        Observable.just("just a test")

  2.                .subscribe(

  3.                        { System.out.println(it) },

  4.                        { it.printStackTrace() }

  5.                )

三. String的处理

Java在使用String.format函数时,需要记住%d、%s等转换符。Kotlin大概是参考了Groovy的语法吧,使用 ${变量名}即可,简单方便。

同样类似Groovy,Kotlin也有三个双引号来表示多行文本的输出。

例如:

 
  
  1.        var jsonString: String = """

  2.            {

  3.                "username":"tony",

  4.                "password":"123456"

  5.            }

  6.            """

  7.        println(jsonString)

执行结果:

 
  
  1.            {

  2.                "username":"tony",

  3.                "password":"123456"

  4.            }

四. 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

主要功能:

1)支持LiveData转换成Observable、Flowable。通过LiveData增加的扩展函数toObservable()、toFlowable()实现。

2)支持RxJava的Observable、Flowbale、Completable、Single、Maybe转换成LiveData。通过它们的扩展函数toLiveData()实现。

3)支持RxJava的Observable、Flowbale、Completable、Single、Maybe绑定Lifecycle。通过它们的扩展函数bindLifecycle()实现。


例如在LoginViewModel中,login()函数大致可能是这样写的,替换了之前使用的RxLifecycle。当然,使用RxLifecycle的作用也是为了避免内存泄露。由于在我们的App架构中已经使用了Android Architecture Components,所以可以考虑替换RxLifecycle。

 
  
  1.    fun login(owner: LifecycleOwner): Observable<LoginResponse> {

  2.        val param = LoginParam()

  3.        param.phoneNo = phoneNumber.value.toString()

  4.        param.zoneCode = zoneCode

  5.        param.validationCode = verificationCode.value.toString()

  6.        return RetrofitManager.get()

  7.                .apiService()

  8.                .login(param)

  9.                .compose(RxJavaUtils.observableToMain())

  10.                .bindLifecycle(owner)

  11.    }

总结

Kotlin许多简化的写法能够带来开发效率的提升,代码也会显得更加整洁和优雅。

该系列的相关文章:

使用Kotlin高效地开发Android App(三)

使用Kotlin高效地开发Android App(二)

使用Kotlin高效地开发Android App(一)


关注【Java与Android技术栈】

更多精彩内容请关注扫码

640?wx_fmt=jpeg


猜你喜欢

转载自blog.csdn.net/SLFq6OF5O7aH/article/details/80491032