本地onclicklistener会导致内存泄漏

时间:2018-11-14 14:53:08

标签: android

像这样定义“ onclicklistener”是否会由于引用当前活动而导致内存泄漏? (即currentActivity.this提及是否创建了对当前活动的强引用,从而防止了对其进行垃圾回收?)

public class currentActivity extends Activity {
        @Override
        public void onCreate() {

            // setup

            myButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(currentActivity.this, newActivity.class);
                    startActivity(intent);
                }
            });
        }
}

2 个答案:

答案 0 :(得分:0)

应该很好,因为活动拥有按钮,而按钮拥有点击侦听器,如果活动被破坏,它将依次杀死按钮及其点击侦听器。

例如,如果您将活动传递给单例对象并将其保留为引用,则可能会导致内存泄漏。

object SomeObject {
   var activity: AppCompatActivity? = null
}

public class currentActivity extends Activity {
    @Override
    public void onCreate() {

        // setup

        myButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                SomeObject.activity = this
                Intent intent = new Intent(currentActivity.this, newActivity.class);
                    startActivity(intent);
                }
            });
        }
}

在活动被破坏时,Singleton将保留对即将被破坏并导致泄漏的活动的引用。

答案 1 :(得分:0)

来自this article Java中的内存泄漏是指某些对象不再被应用程序使用,但是GC(垃圾收集器)无法将其识别为未使用的情况

  1. 如果您使任何ViewActivityApplication 静态或通过它们会妨碍其正常生命周期或类似寿命的方式通过,被认为是内存泄漏
  2. 或注册到侦听器,即使活动被破坏也可以被回调,这也会造成内存泄漏

在您的情况下,如果您的活动被破坏,则回调很容易被垃圾回收,因为它们的范围在该活动之内