关于内存溢出的一些想法(Android)

 

 

Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析

 

关于内存溢出的一些想法(Android)

http://m.oschina.net/blog/54936

 

1. 能用 Application  的 上下文 就用。 因为如果用 Activity 的 Context ,如果用太多的 Activity, 如果 有些资源 还在引用 Activity的context的资源,会导致 这个 Activity 没有被回收,有可能导致 oom、

 

2. bitmap 回收。 在 Fragment 中 可以解绑,但不要 recycle()。 如果 要 recycle 要 确定 这个 bitmap 已经不再使用了,例如左右滑动的 Fragment 或者 Activity, bitmap 就不要 recycle。 但可以解绑。

 

3. Dialog 用完之后, dismiss 之后,设为 null。

 

4. 图片不要做内存缓存,可以做磁盘缓存。 例如 Volley 的 下载图片。 做磁盘缓存

 

源码分析:

    protected void onDestroy() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
        mCalled = true;

        // dismiss any dialogs we are managing.
        if (mManagedDialogs != null) {
            final int numDialogs = mManagedDialogs.size();
            for (int i = 0; i < numDialogs; i++) {
                final ManagedDialog md = mManagedDialogs.valueAt(i);
                if (md.mDialog.isShowing()) {
                    md.mDialog.dismiss();
                }
            }
            mManagedDialogs = null;
        }

        // close any cursors we are managing.
        synchronized (mManagedCursors) {
            int numCursors = mManagedCursors.size();
            for (int i = 0; i < numCursors; i++) {
                ManagedCursor c = mManagedCursors.get(i);
                if (c != null) {
                    c.mCursor.close();
                }
            }
            mManagedCursors.clear();
        }

        // Close any open search dialog
        if (mSearchManager != null) {
            mSearchManager.stopSearch();
        }

        getApplication().dispatchActivityDestroyed(this);
    }

 

// 下面这些操作 要在 onDestroy 前执行

    @Override
    protected void onDestroy() {  
        //停止线程
        CommonUtils.stopAsyncTask(mHasMsgTask);  
        CommonUtils.stopAsyncTask(mGetExtraDataTask);
        statTimer.cancel();
        extraDataTimer.cancel();
        hasSystemMsgTimer.cancel();
        hasLetterTimer.cancel();
        super.onDestroy();
    }

 

 

图片解绑:

com.xingjiabi.shengsheng.base.XjbBaseActivity

    protected static void unbindDrawable(Activity activity) {
        View rootView = null;
        try {
            rootView = ((ViewGroup) activity.findViewById(android.R.id.content))
                    .getChildAt(0);
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (rootView != null) {
            PictureUtil.unbindDrawables(rootView);
        }
    }

 

 

    /**
     * final 在 引用执行完后,就会被销毁。 Activity 销毁的时候 就会被销毁?
     * static 在Application 结束 之后 才会被销毁
     */

 

方法1: 

 

以前 请求 网络图片 的 优化方法是:

在 ListView 中 把 postion 传入到请求图片的方法中,请求成功后, 在根据 postion 获取到对于的View ,再设值。 这样 子线程中 就不会占有View,导致不能Context 没有释放。

 

方法2:

现在 开源的,例如 Volley 是把 imgView 引用传入。

 

 

关于 Handler 的 static

Handler 写成 static 有个好处是 不在依赖 Activity 的 Context,这样 就算 Handler 被 子线程 引用的时候,也不会导致 Activity 结束的时候,由于 子线程 还在引用 Handler,导致 Activity 的 Context 其实 没有被回收。 

 

 

 


 

 

 Android(Java)中常见的容易引起内存泄漏的不良代码:

 

1. 查询数据库没有关闭游标

2. 构造Adapter时,没有使用缓存的 convertView 

3. Bitmap对象不在使用时调用recycle()没有及时释放 

4.没有及时释放对象的引用

    简单举个例子:比如两个Activity之间传递的Context 或其它的自定义对象,使用完后必须立即释放 即:Activity = null ;    Context = null ; Object = null;可以的话在这释放对象之后通知系统来回收:System.gc();这样最好了!

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。