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
原创粉丝点击