Android:对findViewById的引用

时间:2016-04-02 17:47:34

标签: java android memory reference findviewbyid

当我从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是否会丢失其点击功能?

我正在尝试优化应用内存使用的方法。

1 个答案:

答案 0 :(得分:1)

  

第二种方法的内存效率更高吗?

不是特别的。 Iterator<Set<Set<int[]>>> iter = Sa.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } 参考费用约为8个字节。

  

不再有类变量强引用,因此垃圾收集可以更容易发生

不是在这种情况下,因为其他事情都持有LinearLayout addComment。毕竟,LinearLayout从某处获得了findViewById()