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

无论何时我们需要对小部件的引用,我们使用findByViewById。

当我们在同一个Activity类的代码中引用这个小部件的时候,我们可以采取以下两种方法之一:

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

哪个方法是beter? 每种方法在性能和记忆方面有什么优点和缺点? 请帮忙。

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

Solutions Collecting From Web of "每当需要时,在Activity生命周期中每次调用findViewById是否好?"

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

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

将小部件存储在私人引用中是相当安全的,这些引用在configuration更改时会失效,但是您的活动也会被破坏。

第二种可能性显然是更好的。

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

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

访问一个成员variables总是比任何函数调用都快。 这个variables的使用空间是不重要的。 顺便说一下:代码看起来更清洁!

你应该根据你的目的来决定。 为视图添加对象比使用活动方法获取视图要快。 但是这也意味着你正在使用一个内存作为参考,并且会导致内存泄漏。

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

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

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