【问题标题】:Is it good to call findViewById every time in Activity lifecycle whenever required?每次需要时在 Activity 生命周期中调用 findViewById 是否很好?
【发布时间】:2014-01-13 09:50:57
【问题描述】:

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

当我们在同一个 Activity 类的代码中大量引用小部件时,我们可以采用任何一种方法:

  1. 在 Activity 生命周期中每次调用 findViewById。
  2. 第一次获取,将引用存储为Activity类的私有实例变量。

哪种方法更好?就性能和内存而言,每种方法的优缺点是什么。请帮忙。

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

【问题讨论】:

标签: android performance


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    显然第二种可能性更好。

    findViewById 遍历整个视图层次结构,这当然比引用要花费更多时间。

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

    【讨论】:

    • 感谢官方的链接:)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        例如:如果您必须访问嵌套在布局中的图像视图,您希望如何访问它并获取它的标签。

        访问 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;
         }
        

        【讨论】:

          猜你喜欢
          • 2023-03-14
          • 2011-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-06
          • 1970-01-01
          相关资源
          最近更新 更多