返回首页
当前位置: 主页 > 网络编程 > Android教程 >

Kotlin 在 Android 开发中的 16 个建议

时间:2017-07-03 10:28来源:知行网www.zhixing123.cn 编辑:麦田守望者

为了建立我们的 Kotlin 开发经验,我们决定汇总编辑 Savvy 旗下所有 Android 开发团队中最有用和大家最喜欢的开发建议。阅读这些建议之前,你应该先看看 Kotlin 官方文档1,并在 try.kotlinlang.org2 这个网站上亲自探索一下这门语言。由于这些建议专门针对 Kotlin 在 Android 平台上面的开发 ,因此你也应该有基于 Android SDK 开发的经验。同时,你也应该熟悉由 Kotlin 的创建者 JetBrains 提供的 Kotlin 插件和在 Android Studio 中使用 Kotlin3。

Kotlin 在 Android 开发中的 16 个建议
 


注意,这些建议是基于你对 Kotlin 的熟悉程度进行排序的,所以你可以根据自身的技术水平很容易的跳过一些觉得没必要看的建议。

初级建议

延迟加载

延迟加载有几个好处。首先由于加载时机推迟到了变量被访问时,因此它可以提高应用的启动速度。相比于使用 Kotlin 开发服务端应用,这一特性对开发 Android 应用而言特别有用。对于 Android 应用来说,我们想要减少应用启动时间,这样用户可以更快看到应用的内容,而不是干等着看启动加载页面。

其次,这样的延迟加载也有更高的内存效率,因为我们只在它被调用时才将资源加载进内存。在 Android 这样的移动平台上,内存的使用是非常重要的。因为手机资源是共享的且有限的。例如,如果你创建一个购物应用程序,而用户可能只会浏览你的物品,那么你可以延迟加载购买相关的 API:
val purchasingApi: PurchasingApi by lazy {
val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(MoshiConverterFactory.create())
.build()
retrofit.create(PurchasingApi::class.java)
}

通过使用像这样的延迟加载,如果用户根本没有想要在应用中发生购买行为,你的应用将不会加载 PurchasingApi,因此不会消耗它可能会占用的资源。

延迟加载也是封装初始化逻辑的好方法:
// bounds is created as soon as the first call to bounds is made
val bounds: RectF by lazy {
RectF(0f, 0f, width.toFloat(), height.toFloat())
}

只有当 bounds 变量第一次被引用时,将会使用 view 的当前宽和高的值来创建 RectF,这样我们就不需要一开始显式的创建 RectF,然后把它设置给 bounds。

自定义 Getters/Setters

Kotlin 的自定义 getters 和 setters 使用 model 类的结构,但指定自定义的行为来获取和设置字段值。当为某些框架例如 Parse SDK 使用自定义 model 类时,我们获取的值不是存放在类实例的局部变量中,而是通过某些自定义方式存储和检索到的值,例如从 JSON 中。通过使用自定义的 getters 和 setters,我们可以简化存取方法的定义:
@ParseClassName("Book")
class Book : ParseObject() {

// getString() and put() are methods that come from ParseObject
var name: String
get() = getString("name")
set(value) = put("name", value)

var author: String
get() = getString("author")
set(value) = put("author", value)
}

存取上面定义的字段的方式看起来和传统的访问 model 类的方式类似:
val book = api.getBook()
textAuthor.text = book.author

现在如果你的 model 类的数据来源需要从 Parse SDK 改为其他的数据源,那么你的代码可能只需要修改一个地方即可。

Lambdas 表达式

Lambdas 表达式在减少源文件中代码的总行数的同时,也支持函数式编程。虽然目前在 Android 开发中(译者注:使用 Java 语言)可以使用 lambdas 表达式,但要么需要在工程中引入 Retrolambda4,要么需要改变工程构建时的配置,但 Kotlin 更进一步,完全不需要这些额外的操作即可支持 lambdas。

例如,使用 lambdas 表示式时,onClickListener 的用法如下:
button.setOnClickListener { view ->
startDetailActivity()
}

它甚至可以支持返回值:
toolbar.setOnLongClickListener {
showContextMenu()
true
}

Android SDK 中有很多设置 listener 或者需要实现单个方法的场景,在这些场景下 lambdas 表示式可以发挥很大的作用。

数据类

数据类简化了类的定义,自动为类添加equals(),hashCode(),copy() 和toString() 方法。它明确定义了 model 类的意图,以及应该包含什么内容,同时将纯数据与业务逻辑分离开来。

我们以一个例子来看下数据类的定义:
data class User(val name: String, val age: Int)

就这么简单,不需要再增加其他的定义,这个类就可以正常工作了。如果将数据类和 Gson 或者类似的 JSON 解析函数库一起使用,你可以像下面代码这样使用默认值创建默认的构建方法:
// Example with Gson's @SerializedName annotation
data class User(
@SerializedName("name") val name: String = "",
@SerializedName("age") val age: Int = 0
)

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):Android
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
猜你感兴趣