在实际的项目开发中,有时候我们需要频繁的启动某个页面(Activity),启动的时候总是需要初始化一些资源,为了避免重复创建相同资源,常常会使用静态对象去保存这些值,这种情况下,也很容易照成内存泄漏。
请大家思考,为什么会内存泄漏?
我们结合leakCanary给出的提示去分析,mResource->references->mainActivity
首先,非静态内部类默认会持有外部类的引用。
然后又使用了该非静态内部类创建了一个静态的实例。
该静态实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收。
正确的做法有两种,一种是将内部类改成静态内部类,还有就是将testResource抽取出来,封装成一个单例,如上一个例子那样,但是需要context时单例要切记注意Context的泄漏,使用applicationContext。
例子如下:
public class CoreActivity extends AppActivity{
private static TestCoreRes ttCoreRes = null;@Override protected void onCreate(){ initData(); } private void initData(){ if(ttCoreRes==null){ ttCoreRes = new TestCoreRes(); } } private class **static** TestCoreRes{ }
}
注解:static为改动的地方