Java 内存泄漏场景整理(2)

2020-01-30  本文已影响0人  Franck2020

非静态内部类的静态实例

非静态内部类会持有外部类实例的引用,如果非静态内部类的实例是静态的,就会间接地长期维持着外部类的引用,阻止被系统回收。代码如下:

public class SecondActivity extends AppCompatActivity {

    private static Object inner;

    private Button button;

    @override

    protected void onCreate (Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.bt_next);

        button.setOnClickListener(new View.OnClickListener() {}

        @override

        public void onClick (View v) {

            createInnerClass();

            finish();

        }

    });

}

void createInnerClass () {

    class InnerClass {

    }

    inner = new InnerClass();

}

当点击Button时,会在inner = new InnerClass()语句处,创建非静态内部类InnerClass的静态实例inner,该实例的生命周期会和应用程序一样长,并且一直持有SecondActivity的引用,导致SecondActivity无法被回收。

上一篇 下一篇

猜你喜欢

热点阅读