每当我们需要对小部件的引用时,我们使用findByViewById。
当我们在同一个Activity类的代码中引用窗口小部件时,我们可以遵循以下任一方法:
哪种方法更好?在性能和内存方面,每种方法的优缺点是什么。请帮忙。
编辑:如果我们从A到B移动到新活动,我们不会完成A,因为我们想要在后退时打开A.在这种情况下如何处理上述问题?请帮忙。
答案 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;
}