activity destory掉后马上释放内存方法

        其实关心这个问题有很长很长时间了,只要是做过内存优化的战友们都非常关心非常纠结内存问题,但是这个问题却纠结的我时间最长,不过最近解决了部分。

       当某一个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();
    }






        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值