内存泄露
内存没有及时的被收回可理解为内存泄露;
例如Activity中有一个耗时操作,耗时操作中有对Activity强引用;
当Activtiy被用户关闭时,耗时操作还没结束的话,此时activtiy不能被释放,造成内存泄露!
解决方案:
耗时操作中使用弱引用指向activtiy,这样activtiy的生命周期就不受耗时操作的影响了!
例子:
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];
//这里可能为空,因为当activtiy被收回后mWrTv就会空,因此需要进行判断
if (mWrTv.get() != null) {
mWrTv.get().setText(num + "");
}
}
}
内存溢出
当创建对象时,没有足够的内存时,便出现内存溢出(OOM),常见为listview加载图片;
解决方案:
采用软引用方式对图片对象进行引用;
当内存不足时系统便收回软引用的图片,从而解决oom;
网友评论