【内存泄露】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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值