activity destory掉后马上释放内存方法
来源:互联网 发布:excel数据库设计 编辑:程序博客网 时间:2024/06/06 09:33
其实关心这个问题有很长很长时间了,只要是做过内存优化的战友们都非常关心非常纠结内存问题,但是这个问题却纠结的我时间最长,不过最近解决了部分。
当某一个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(); }
0 0
- activity destory掉后马上释放内存方法
- 探究Android 关于Activity调用finish()方法后的内存释放情况
- 窗口关闭后释放内存的方法
- activity 内存释放
- android中xml中的资源不会随activity的destory而destory掉
- 最小化后释放内存
- cvLoadImage后释放内存
- ios 用了ARC技术后内存释放的方法
- 采用后台绘图方法绘制完成后要释放内存
- init和destory方法
- Linux 释放内存方法
- Linux 释放内存方法
- linux释放内存方法
- Linux 释放内存方法
- Linux 释放内存方法
- vector内存释放方法
- Linux 释放内存方法
- [ArcEngine] 释放内存方法
- 自动创建文件目录
- Java8 新特性之二---------接口的默认方法和静态方法
- WebLogic Portal 项目元素结构关系
- DateFormat和SimpleDateFormat
- Android 自定义View (一)
- activity destory掉后马上释放内存方法
- struts2中 # % $ (井号,星号,百分号)的区别和用法
- 页面数据关闭,或刷新,或链接到其他页面提示有否保存数据
- CSS padding margin border属性详解(图解、赞)
- 二叉树的深度优先遍历(栈)和广度优先遍历(队列)
- hdu 1097 A hard puzzle 快速幂 找规律 H
- UITableView的使用(UITableViewCell\section页眉\section页脚复用、sectionHeaderView点击效果)
- MyBatis学习总结
- vc++ 将文件大小格式化