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();
}