Android 在onCreateView之外初始化视图有什么缺点吗?
通常,视图是一个实例变量,在Android 在onCreateView之外初始化视图有什么缺点吗?,android,Android,通常,视图是一个实例变量,在onCreateView方法中初始化,如下面示例中的TextView所示 private TextView recipeTitle; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_recipe_
onCreateView
方法中初始化,如下面示例中的TextView
所示
private TextView recipeTitle;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_recipe_detail, container, false);
recipeTitle = (TextView) view.findViewById(R.id.text_title);
return view;
}
public void setRecipeTitle(String recipeTitle) {
this.recipeTitle.setText(recipeTitle);
}
如果不将TextView
作为一个实例变量,而只是从如下所示的所需方法访问它,会有什么缺点吗
public void setRecipeTitle(String recipeTitle) {
if (getView() != null) {
((TextView) getView().findViewById(R.id.text_title)).setText(recipeTitle);
}
}
findViewById
不是你能打的最便宜的电话。我们鼓励您仅在必要时使用它
但是,只要您不经常调用setRecipeTle
,性能就不会太差
但一般来说,防御性地编写代码更安全,因为自定义视图的用户可能不知道调用它的成本比他们习惯的要高
总结:任何一种代码模式都可以工作;前一种模式(先保存findviewbyd
lookup)会稍微好一些,但在这种特定情况下不会太多
编辑:最好在
onCreateView
中进行编辑的另一个原因是,这样可以进行更简单的空检查。在后一个示例中,如问题中所述,setRecipeTitle
如果在onCreateView进入Android生命周期之前调用,则会抛出空引用异常。(一个罕见的案例;不确定为什么在单元测试期间会发生意外?无论如何,Android框架生命周期充满了这些空引用问题,没有任何编译时安全性…唉。)但是如果您在onCreateView
(在前一个示例中)中设置成员变量,那么您可以只检查其中一个空,不要将后一个示例固定为null,而是检查整个调用链(在各种情况下,所有调用都可以返回null) findViewById
不是你能打的最便宜的电话。我们鼓励您仅在必要时使用它
但是,只要您不经常调用setRecipeTle
,性能就不会太差
但一般来说,防御性地编写代码更安全,因为自定义视图的用户可能不知道调用它的成本比他们习惯的要高
总结:任何一种代码模式都可以工作;前一种模式(先保存findviewbyd
lookup)会稍微好一些,但在这种特定情况下不会太多
编辑:最好在
onCreateView
中进行编辑的另一个原因是,这样可以进行更简单的空检查。在后一个示例中,如问题中所述,setRecipeTitle
如果在onCreateView进入Android生命周期之前调用,则会抛出空引用异常。(一个罕见的案例;不确定为什么在单元测试期间会发生意外?无论如何,Android框架生命周期充满了这些空引用问题,没有任何编译时安全性…唉。)但是如果您在onCreateView
(在前一个示例中)中设置成员变量,那么您可以只检查其中一个空,不要将后一个示例固定为null,而是检查整个调用链(在各种情况下,所有调用都可以返回null) 在父视图膨胀后,可以随时调用findviewbyd()
。然而,它相当昂贵。如果您使用第二个示例并频繁调用setRecipeTitle()
,您将看到应用程序的性能受到重大影响。在父视图膨胀后,您可以随时调用findViewById()
。然而,它相当昂贵。如果您使用第二个示例并频繁调用setRecipeTitle()
,您将看到应用程序的性能受到显著影响。没有,没有。但同样也没有好处。我总是用第二种方式访问它!:)请记住,在Java中,所有代码都必须在一个类中。如果显示包含所示方法的类,则此处的代码示例将更清晰。这很可能是一个片段
子类。您应该明确地显示这一点,这样我们就不必做任何假设。您可以使用视图注入库来绕过FindViewByDNO的使用—没有。但同样也没有好处。我总是用第二种方式访问它!:)请记住,在Java中,所有代码都必须在一个类中。如果显示包含所示方法的类,则此处的代码示例将更清晰。这很可能是一个片段
子类。您应该明确地显示这一点,这样我们就不必做任何假设。您可以使用视图注入库来绕过findViewById的使用