从侦听器访问本地最终变量是否需要检查null?

时间:2017-05-23 13:02:53

标签: java android memory-management

当我们有以下内容时:

final TextView view = (TextView) layout.findViewById(R.id.some_view);  

button.setOnClickListener(new OnClickListener() {  
    public void onClick(View v) {    
       view.setText(“blah”);    
    }   
}  

//等

view除非final方法无法访问onClick 如果此代码段位于方法内,则会在堆栈上分配view,并保留对堆的引用。因此,在方法结束时,调用view将丢失。由于onClick位于同一范围内,view仍然可见。我的问题是:onClick可以随时调用。将其标记为final是否确保在侦听器运行时view不为空?或者是否需要检查空值?那是为什么会这样呢?

2 个答案:

答案 0 :(得分:0)

如果您的布局不包含R.id.some_view,则findViewById()可能会返回null。所以你可能需要检查是否为null。 检查null的位置取决于您的应用程序逻辑。匿名OnClickListener对象将创建内部"视图"复制,所以即使外观"查看"超出范围,听众仍然会参考"视图"变量。 在哪里检查null是你的选择,但是如果findViewById()返回null,那么你可能不应该创建单击一个监听器。

答案 1 :(得分:0)

我测试了你的最终代码

但是这个Textview不是空的。

也许布局没有textview

您必须检查textview您的布局。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R
            .layout.activity_main);

    Button button =(Button)findViewById(R.id.button);
    final TextView view = (TextView)findViewById(R.id.some_view);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            view.setText("Hello world");
        }
    });

}