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

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

一. 运算符重载



在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许多简化的写法能够带来开发效率的提升,代码也会显得更加整洁和优雅。

相关文章
|
12月前
|
缓存 移动开发 JavaScript
如何优化UniApp开发的App的启动速度?
如何优化UniApp开发的App的启动速度?
1740 139
|
12月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1957 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
12月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1252 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
12月前
|
人工智能 前端开发 JavaScript
最佳实践3:用通义灵码开发一款 App
本示例演示使用通义灵码,基于React Native与Node.js开发跨平台类通义App,重点展示iOS端实现。涵盖前端页面生成、后端代码库自动生成、RTK Query通信集成及Qwen API调用全过程,体现灵码在全栈开发中的高效能力。(238字)
1104 11
|
12月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
561 0
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
778 1
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
316 28
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
417 5
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
315 3