Kotlin的Android扩展和变量

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

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

以减少锅炉代码的数量和findViewById调用的数量。

通过引入Kotlin的Android扩展,我们可以通过简单地使用以下参考来引用相同的Button:

 btn_foo 

问题:

  1. btn_foo是否保存了Button的引用,还是每次调用findViewById
  2. 开发者是否btn_foo使用变量来存储btn_foo来提高应用程序的性能,或者直接在代码中使用呢?

编辑:有一个解释如何扩展工作,但它仍然有点不清楚。

它的缓存,所以findViewById不会被调用,每当你需要它。 存储变量不一定会提高应用程序的性能

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