Kotlin高效地开发Android App(四)

2020-04-1911:15:57APP与小程序开发Comments1,566 views字数 2931阅读模式
Kotlin高效地开发Android App(四)

一. 运算符重载

在Kotlin的世界里,我们可以重载算数运算符,包括一元运算符、二元运算符和复合赋值运算符。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

使用operator修饰符来修饰特定函数名的函数,这些函数可以是成员函数也可以是扩展函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

例如,在RxKotlin的disposable.kt中有这样一个方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

operator fun CompositeDisposable.plusAssign(disposable: Disposable) {
    add(disposable)
}
复制代码

它满足两个条件:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

  1. 使用operator进行修饰
  2. 使用了plusAssign作为函数名

所以可以重载复合运算符+= , 那如何使用它呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

compositeDisposable += RxBus.get().register(PaySuccessEvent::class.java) { getServices() }
复制代码

它等价于下面的代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

compositeDisposable.add(
    RxBus.get().register(PaySuccessEvent::class.java) { getServices() }
)
复制代码

我们会发现,重载了运算符之后代码会显得更加简洁和优雅。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

二. 简化的lambda表达式

使用Kotlin高效地开发Android App(一)中,曾经介绍过尾随闭包,它可以算是一种简化的lambda表达式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

对于UI控件的点击事件,可以查看我同事的文章View.OnClickListener在Kotlin中的进化文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

由最初的Java版本文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        v.setVisibility(View.VISIBLE);
        ...
    }
});
复制代码

使用Kotlin不断地进行简化,最后变成:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

view.setOnClickListener {
    it.visibility = View.VISIBLE
    ...
}
复制代码

再举一个RxJava的例子。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

        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进行简化,可以这样写。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

        Observable.just("just a test")
                .subscribe(s -> {
                    System.out.println(s);
                }, throwable -> {
                    throwable.printStackTrace();
                });
复制代码

同样的代码,使用Kotlin来写的话会更加简单。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

        Observable.just("just a test")
                .subscribe(
                        { System.out.println(it) },
                        { it.printStackTrace() }
                )
复制代码

三. String的处理

Java在使用String.format函数时,需要记住%d、%s等转换符。Kotlin大概是参考了Groovy的语法吧,使用${变量名}即可,简单方便。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

同样类似Groovy,Kotlin也有三个双引号来表示多行文本的输出。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

        var jsonString: String = """
            {
                "username":"tony",
                "password":"123456"
            }
            """
        println(jsonString)
复制代码

执行结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

            {
                "username":"tony",
                "password":"123456"
            }
复制代码

四. RxJava 和 LiveData、Lifecycle

LiveData和Lifecycle是Google在2017年新出的Android Architecture Components的中的一部分。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

LiveData组件用于持有可观测的数据,它掌握着组件的生命周期信息,在组件出现活跃状态时提供更新,一般用于创建响应式UI。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

Lifecycle组件用于创建能够感知自身生命周期、能够基于自身状态调整行为的activity和fragment。组件可以经历多种状态——初始化、已创建、已启动、已恢复、已销毁,在状态发生改变时会调用生命周期方法来执行各种动作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

借助Kotlin的扩展函数和RxJava的特性,以及参考了https://github.com/YvesCheung/LiveDataToRxJava这个库。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

我做了一个LiveData的扩展库 github地址:https://github.com/fengzhizi715/LiveDataExtension文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

主要功能:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

  • 支持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。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

    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许多简化的写法能够带来开发效率的提升,代码也会显得更加整洁和优雅。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

作者:Tony沈哲
链接:https://juejin.im/post/5b076911f265da0de2575131
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18199.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/xcx/18199.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定