Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onCreateView之外初始化视图有什么缺点吗?_Android - Fatal编程技术网

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的使用