getLayoutInflater vs LayoutInflater.from

时间:2014-10-30 07:27:06

标签: android

研究一些(已知是好的)代码我可以看到如下逻辑:

if (getContext() instanceof Activity) {
      inflater=((Activity)getContext()).getLayoutInflater();
}
    else {
      inflater=LayoutInflater.from(getContext());
}

我想知道,为什么这个if/else,在所有情况下使用LayoutInflater.from会更好?

2 个答案:

答案 0 :(得分:12)

这并不重要。

活动delegates getLayouInflater() to WindowWindow PhoneWindow的常规政策实施依次为initializes its inflater with LayoutInflater.from(context),其中context为活动。

所以inflater对象实际上是相同的,在活动的情况下使用相同的Context

LayoutInflater.from()真的是wrapper for Context.getSystemService()。现在,系统服务是looked up by name from a map,然后是retrieved from a cache。与访问Activity中已初始化的成员变量相比,此查找有一些开销。

所以它闻起来像微优化,与实际的视图层次结构通胀相比,不会影响很多运行时性能。

此优化实际上可能会对开发人员的工作效率产生负面影响,因为人们需要停下来并花一些时间思考代码存在的原因。

答案 1 :(得分:1)

通过相同的代码,它接缝处理LayoutInflater.from用于非活动的上下文中。我假设使用Activity的inflater重用已经创建的inflater而不是从上下文创建layoutinflater的另一个选择。

我要做的唯一改变是在变量中保存上下文以防止调用相同的函数并重复从对象中检索相同的值:

Context ctx = getContext();
if(ctx instanceof Activity) {
  inflater = ((Activity)ctx).getLayoutInflater();
}
else {
  inflater = LayoutInflater.from(ctx);
}

Android在可用时重复使用项目有很多优化,例如可以重复使用的ListView视图。