Kotlin的Android扩展和变量
在Kotlin之前,Android开发人员应该在这样一个变量中保存对Activity的Views的引用:
Button fooBtn = (Button) findViewById(R.id.btn_foo)
以减少锅炉代码的数量和findViewById
调用的数量。
通过引入Kotlin的Android扩展,我们可以通过简单地使用以下参考来引用相同的Button:
btn_foo
问题:
-
btn_foo
是否保存了Button的引用,还是每次调用findViewById
? - 开发者是否
btn_foo
使用变量来存储btn_foo
来提高应用程序的性能,或者直接在代码中使用呢?
编辑:有一个解释如何扩展工作,但它仍然有点不清楚。
它的缓存,所以findViewById
不会被调用,每当你需要它。 存储变量不一定会提高应用程序的性能
Kotlin Android Extension(KAE)开发者之一Ihor Kucherenko证实:
-
KAE将在第一次调用之后保持对视图的引用,而不是始终使用
findViewById
。 这只适用于Activities
和Fragments
。 -
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
。