在需要时,每次在Activity生命周期中调用findViewById是否合适?

时间:2014-01-13 09:50:58

标签: android performance

每当我们需要对小部件的引用时,我们使用findByViewById。

当我们在同一个Activity类的代码中引用窗口小部件时,我们可以遵循以下任一方法:

  1. 每次在Activity生命周期中调用findViewById。
  2. 第一次获取它,将引用存储为Activity类的私有实例变量。
  3. 哪种方法更好?在性能和内存方面,每种方法的优缺点是什么。请帮忙。

    编辑:如果我们从A到B移动到新活动,我们不会完成A,因为我们想要在后退时打开A.在这种情况下如何处理上述问题?请帮忙。

6 个答案:

答案 0 :(得分:4)

这两种方法都有风险。通常,您应该尽可能少地调用findViewById(),另一方面,在Activity类上存储引用可能会导致内存泄漏。这在很大程度上取决于你想做什么,你打电话给它多少次,并在此基础上选择其中一种方法。为此,你需要分析你的代码,如果你不清楚哪个更好,只需尝试两个并选择“不那么糟糕”,但通常第一种方法比第二种方法更差,因为你知道你'我总是要找到你已定义id的所有元素。

答案 1 :(得分:3)

大多数开发人员使用方法2,主要是因为它更有效。如果你的布局很复杂,那么findViewById必须遍历它的树才能找到需要时间的给定小部件。在列表视图中,您主要使用ViewHolder模式,该模式允许您存储对列表项窗口小部件的引用。由于列表被重新绘制,因此大大加快了渲染速度。

将小部件存储在私有引用中是非常安全的,这些引用在配置更改时会失效,但您的活动也会被销毁。

答案 2 :(得分:2)

第二种可能性显然更好。

findViewById遍历整个视图层次,这当然比参考花费更多的时间。

Dianne Hackborn(Android工程师)在此提供了有关该主题的一些详细信息:https://groups.google.com/forum/#!topic/android-developers/_22Z90dshoM

答案 3 :(得分:1)

访问成员变量总是比任何函数调用都快。该变量的已用空间无关紧要。 顺便说一句:代码看起来更干净!

答案 4 :(得分:1)

您应该根据自己的目的来决定。为视图保留对象比使用活动方法获取视图更快。但这也意味着您使用内存作为参考,它可能导致内存泄漏。

答案 5 :(得分:0)

我可能错了,因为我是Android新手,但我更喜欢存储一个变量; 它编写的代码较少。

例如:如果您必须访问嵌套在布局中的imageview,您希望如何访问它并获取其标记。

访问1:

public Integer getTag(){
       FrameLayout frame1 = (FrameLayout) findViewById(R.id.frame_1);
       LinearLayout linear3 = (LinearLayout) frame1.findViewById(R.id.linear_3);
       ImageView imgView = (ImageView) linear3.findViewById(R.id.myImg);
       return Integer.valueOf( imgView.getTag().ToString());
}

访问2:

 private ImageView myImageView;
 @Override
 public void onCreate( Bundle savedInstanceState){
       //set access to variable
 }   

 public Integer getTag(){
       //return Integer.valueOf( myImageView.getTag().ToString());
       //can be written
       Integer mTag = Integer.valueOf(myImageView.getTag().ToString());
       return mTag;
 }