有时候程序会重复使用资源,我们只需要创建一个实例就可以,避免重复创建实例,占用内存。
这看起来,并不会产生内存泄漏,然而非静态内部类,写在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