其实关心这个问题有很长很长时间了,只要是做过内存优化的战友们都非常关心非常纠结内存问题,但是这个问题却纠结的我时间最长,不过最近解决了部分。
当某一个activity被finish掉后,我们想要马上释放他占用的内存,但是为什么没有被释放呢?如何做呢?
1.首先要解决的是看看你的有没有内存泄漏,如果有,抱歉,即使你调用了几百次finish也不会释放掉内存的。。。。
2.不要在ondestory()方法中去做数据保存啊,数据清除啊等工作,因为ondestory()方法你是不确定什么时候会执行的,所以如果有数据保存等工作,不要在onpause()方法(因为执行的频率太高,除非你们就需要这样),onstop()方法和ondestory()方法(因为不确定什么时候去执行此方法),同样的道理,也不要在ondestory()方法做释放内存的工作,那么应该怎么做呢?自己写一个方法,下面的toFinish()方法,当需要关闭页面的时候去调用此方法。言归正传,在finish页面的时候,我们需要把所有的数据,特别是bitmap啊等占用内存的成员变量制为null,当然如果有listadapter啊,你还需要将adapter中的数据先要清空,这样就可以了(测试发现即使不能马上释放,延迟几秒也可以释放的),我举个例子在下面:
所有的成员变量如下:
<span style="font-size:14px;"> private LinearLayout mLlDireHolder;
private HorizontalScrollView mHorizScroView;
private ListView mLvFolders;
private FolderListAdapter mFolderListAdapter;
private ArrayList<ArrayList<String>> mAllFileData;
private ArrayList<String> mFileNames;
private Drawable mDrawable;</span>
其中有一个adapter,adapter中的成员变量也贴出来如下:
<span style="font-size:14px;"> private ArrayList<String> mFileNameList;
private Bitmap mFolderBitmap, mSelectedBitmap, mUnSelectedBitmap;
public String preSelectedFolderPath;
private boolean mCheckBoxVisibility = true;
public File mCurrentFile;</span>
当页面需要关闭的时候呢,我们要自己写个方法做数据保存,内存清除:
<span style="font-size:14px;"> private void toFinish() {
//数据保存工作
mFolderListAdapter.notifyDataChanged(null);
mAllFileData.clear();
mFileNames.clear();
mAllFileData = null;
mFileNames = null;
mDrawable = null;
finish();
System.gc();
}</span>
因为我的有listview的adapter所以,上面方法中有个方法mFolderListAdapter.notifyDataChanged(null),这个就是释放adapter中的内存:
<span style="font-size:14px;"> public void notifyDataChanged(ArrayList<String> mFileNameList) {
this.mFileNameList = mFileNameList;
if (null == mFileNameList) {
if (null != mFolderBitmap && !mFolderBitmap.isRecycled()) {
mFolderBitmap.recycle();
mFolderBitmap = null;
}
if (null != mSelectedBitmap && !mSelectedBitmap.isRecycled()) {
mSelectedBitmap.recycle();
mSelectedBitmap = null;
}
if (null != mUnSelectedBitmap && !mUnSelectedBitmap.isRecycled()) {
mUnSelectedBitmap.recycle();
mUnSelectedBitmap = null;
}
if(null!=mCurrentFile){
mCurrentFile=null;
}
}
notifyDataSetChanged();
}</span>
好了,经过上面的方法,就可以当页面关闭的时候释放内存了。
补充:如果加载图片用的是Glide,那么应该如下方法处理,否则不可以
private void toFinish() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
fileList = null;
if (mAlbumPicPagerAdapter != null) {
mAlbumPicPagerAdapter.setList(null);
}
Glide.get(AlbumPicActivity.this).clearMemory();
System.gc();
}
}, 500);
finish();
}