【内存泄露】Android内存泄漏---非静态内部类创建静态实例

有时候程序会重复使用资源,我们只需要创建一个实例就可以,避免重复创建实例,占用内存。


这看起来,并不会产生内存泄漏,然而非静态内部类,写在Activity里就会出现问题了,Activity的生命周期导致的内存泄漏。


举个栗子:

public class MainActivity extends AppCompatActivity {

    private static Inner inner= null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        if(inner== null){

            inner= new Inner();

        }

        //...

    }

    class Inner{

        //...

    }

}


请注意要点:

1.只要非静态内部类没有销毁,MainActivity就不会被回收(原因请看第2点),所以MainActivity的资源都不会回收,导致内存泄漏。

2.非静态内部类默认持有外部类引用,如果java基础学的不好的,请看一下这个链接:http://www.cnblogs.com/dolphin0520/p/3592498.html


分析代码的问题:

1.非静态内部类Inner,生命周期和Application一样,只要程序没关闭,Inner就不会被销毁,对号入座:对应要点1。

2.非静态内部类Inner,对号入座:对应要点2。

3.所以内存泄漏问题肯定是存在的。


解决代码问题:

1.将非静态内部类Inner改成静态内部类。

2.将非静态内部类Inner提取出来,封装成单例。

3.采用第2种方式,请参照http://blog.csdn.net/qq_29266921/article/details/54846845


版权声明:本文为qq_29266921原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。