內(nèi)存泄露
內(nèi)存沒有及時(shí)的被收回可理解為內(nèi)存泄露;
例如Activity中有一個(gè)耗時(shí)操作,耗時(shí)操作中有對(duì)Activity強(qiáng)引用;
當(dāng)Activtiy被用戶關(guān)閉時(shí),耗時(shí)操作還沒結(jié)束的話,此時(shí)activtiy不能被釋放,造成內(nèi)存泄露!
解決方案:
耗時(shí)操作中使用弱引用指向activtiy,這樣activtiy的生命周期就不受耗時(shí)操作的影響了!
例子:
static class MyTask extends AsyncTask<String, Integer, String> {
private WeakReference<TextView> mWrTv;
public MyTask(TextView textView) {
mWrTv = new WeakReference<>(textView);
}
@Override
protected String doInBackground(String... strings) {
for (int i = 0; i <= 10; i++) {
publishProgress(i);
Thread.sleep(1000);
}
return "";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int num = values[0];
//這里可能為空,因?yàn)楫?dāng)activtiy被收回后mWrTv就會(huì)空,因此需要進(jìn)行判斷
if (mWrTv.get() != null) {
mWrTv.get().setText(num + "");
}
}
}
內(nèi)存溢出
當(dāng)創(chuàng)建對(duì)象時(shí),沒有足夠的內(nèi)存時(shí),便出現(xiàn)內(nèi)存溢出(OOM),常見為listview加載圖片;
解決方案:
采用軟引用方式對(duì)圖片對(duì)象進(jìn)行引用;
當(dāng)內(nèi)存不足時(shí)系統(tǒng)便收回軟引用的圖片,從而解決oom;