Kotlin的Android扩展和变量

时间:2017-06-28 06:49:45

标签: android kotlin

在Kotlin之前,Android开发人员应该在这样的变量中保存对Activity的视图的引用:

Button fooBtn = (Button) findViewById(R.id.btn_foo)

减少样板代码量和findViewById次调用次数。

通过引入Kotlin's Android Extensions,我们可以通过简单地使用:

来引用相同的Button
btn_foo

问题:

  1. btn_foo是否有对已保存按钮的引用,还是每次都调用findViewById
  2. 开发人员是否仍然假设使用变量来存储btn_foo以提高应用程序的性能,或者直接在代码中使用它?
  3. 修改an explanation Extensions的工作原理如何,但仍然有点不清楚。

2 个答案:

答案 0 :(得分:5)

它已缓存,因此每次需要时都不会调用findViewById。存储变量并不一定会提高应用程序的性能

答案 1 :(得分:4)

其中一位Kotlin Android Extension(KAE)开发人员Ihor Kucherenko确认:

  • KAE将在第一次通话后保留对视图的引用,而不是始终使用findViewById。对ActivitiesFragments

  • KAE不会缓存数据,每次都会使用findViewById任何其他元素(Activity / Fragment除外)。

因此,如果您要初始化ViewHolder

class FooViewHolder(view: View): RecyclerView.ViewHolder(view) {
    fun bind(day: FooItem.Day) {
        btn_foo.text = day.title
    }
}

反编译成Java调用将如下所示:

((Button)this.itemView.findViewById(R.id.btn_foo)).setText((CharSequence)day.getTitle());

这正是你想要避免的。

开发人员可能会意识到这一点。

结论:免费使用KAE而不使用任何其他变量,但只适用于Activitiies / Fragments