当我从UI中引用元素时,我一直在为我的所有活动做这个,我创建了一个类变量。这有时会导致10到20个类变量仅用于UI元素:
public class CommentActivity extends AppCompatActivity {
LinearLayout addComment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_comment);
addComment = (LinearLayout) findViewById(R.id.addcomment);
addComment.setOnClickListener( // add an onclick listener here //);
}
}
现在,我通过查看其他人的代码来观察,有时他们会这样做:
public class CommentActivity extends AppCompatActivity {
// LinearLayout addComment; no more reference to class variable
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_comment);
//they just findViewById and add on the onclick listener
findViewById(R.id.addcomment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
第二种方法更有效吗?不再有类变量强引用,因此垃圾收集可以更容易地发生。但我只是想知道使用第二种方法的风险是什么。如果在使用应用程序时发生垃圾收集,addComment linearLayout
是否会丢失其点击功能?
我正在尝试优化应用内存使用的方法。
答案 0 :(得分:1)
第二种方法的内存效率更高吗?
不是特别的。 Iterator<Set<Set<int[]>>> iter = Sa.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
参考费用约为8个字节。
不再有类变量强引用,因此垃圾收集可以更容易发生
不是在这种情况下,因为其他事情都持有LinearLayout addComment
。毕竟,LinearLayout
从某处获得了findViewById()
。