Android內存泄漏

1,靜態變量導致的內存泄漏

在dalvik虛擬機中,static變量所指向的內存引用,如果不把它設置爲null,GC【garbage collection

】是永遠不會回收這個對象的,所以會導致這個activity無法正常銷燬:

public class MainActivity extends Activity{
    private static Context mContext;

    @ovveride
    proteced void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
}
}

那麼怎麼解決呢,將 mContext賦爲 null 就可以了。

public class MainActivity extends Activity{
    private static Context mContext;

    @override
    proteced void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;

}

    @override
    proteced void onDestroy()
        super.onDestroy();
        if(mContext != null){
            mContext = null;
        }

}

2,單例模式導致的內存泄漏

下面提供一個單例模式的類:

public class SingleInstanceF {  
    private static SingleInstanceF single;  
    private  Context context;  
  
    private SingleInstanceF(Context context){  
        this.context = context;  
    }  
  
    public static SingleInstanceF getInstance(Context context){  
        if(single==null){  
            single = new SingleInstanceF(context);  
        }  
        return single;  
    }  
  
}  

接着來使用這個單例模式:

public class TestActivity extends Activity{  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        SingleInstanceF instanceF = SingleInstanceF.getInstance(this);  
    }  
}  

TestActivity對象被單利模式所引用,同樣當退出activity時activity得不到釋放。

解決方法:在onDestroy()將instance賦值爲null。或者將參數 this 換成 application context。

3,屬性動畫造成的內存泄漏

public class MainActivity extends Activity{
    ObjectAnimator animator;
    Button mButton;
    @override
    proteced void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = findViewById(R.id.button1);
        animator = ObjectAnimator.ofFloat(mButton, "rotation", 0, 360).setDuration(2000);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.start();
    }
}

因爲動畫在無限循環,如果在Activity中播放這個動畫並且沒有在onDestroy中去停止這個動畫,那麼動畫會一直播放下去

,儘管無法在界面上看到動畫效果了,並且這個時候Activity的View會被動畫持有,而View又持有 Activity,最終Activity

無法釋放。解決方法,在onDestroy中調用 animator.cancle()來停止動畫:

public class MainActivity extends Activity{
    ObjectAnimator animator;
    Button mButton;
    @override
    proteced void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = findViewById(R.id.button1);
        animator = ObjectAnimator.ofFloat(mButton, "rotation", 0, 360).setDuration(2000);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.start();

    }

    @override void onDestroy(){
        super.onDestroy();
        animator.cancle();

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章