Kotlin Android Extensions是否会缓存合成属性或每次调用findViewById()?

时间:2017-07-21 20:30:55

标签: android kotlin kotlin-android-extensions

如果我有一个简单的自定义视图:

myitem.xml

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />
<FrameLayout/>

访问kotlinx syntentic属性:

import kotlinx.android.synthetic.main.myitem.view.*

view.toolbar.text = "Some text"

在内部,它会生成对findByViewID()的调用。所以我的问题是:

结果是为自定义视图缓存的,例如活动,还是每次调用findByViewID时的结果?由于性能原因,答案非常重要。

2 个答案:

答案 0 :(得分:8)

在当前版本(1.1.3)中,将为“活动”和“片段”布局缓存视图。对于像RecyclerView ViewHolders这样的其他类型的容器,没有缓存。

此外,缓存是HashMap,其中包含用于键的整数装箱。 SparseArray本来会更好。

编辑:从版本1.1.4开始,如果你让它们实现ViewHolder接口,那么也可以为其他类缓存视图,包括LayoutContainer。您还可以使用@ContainerOptions注释指定另一个缓存实现,包括SparseArray。这两个功能仍处于试验阶段,需要在build.gradle文件中手动启用:

androidExtensions {
    experimental = true
}

Read more关于它。

答案 1 :(得分:4)

由于1.1.4视图可以在任何类中缓存。 默认情况下启用自定义视图中的缓存。对于ViewHolders,您需要实现LayoutContainer接口,如下所示: class MyViewHolder(override val containerView: View): LayoutContainer

有关详细信息,请参阅此文档 https://github.com/Kotlin/KEEP/blob/master/proposals/android-extensions-entity-caching.md

更新: 为了能够使用LayoutContainer,您应该将其添加到gradle脚本: androidExtensions { experimental = true }