首页 > 代码库 > 关于内存溢出的一些想法(Android)

关于内存溢出的一些想法(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();这样最好了!

 

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