Android内存泄露问题(一)之context的引用

来源:互联网 发布:数据挖掘 数学基础 编辑:程序博客网 时间:2024/06/15 19:42

    Android内存泄露在项目中出现情况较为频繁,如果严重的话可能会导致应用内存占用情况严重。

    导致内存泄露的原因非常多,本文介绍下比较常见的context的引用导致的内存泄露!

    Android界面比较多,基本都需要引用到context,平时用时不注意,在当前Activity直接传this,长期的结果就会出现较多释放不掉的类,导致内存泄露。

    有时候虽然传入的是context对象,但组件需要的是Activity,如dialog。而有时候需要的只是简单的context就ok,我们也经常直接Activity.this传入。以下

   为内存泄露的几种情况:

    1) 传入的Context为Activity.this

    private static TestService service;
    public static DataSourceService getInstance(Context context)
    {
        synchronized (lock)
        {
            if (service == null)
            {
                service = new TestService(context);
            }
            return service;
        }
    }

   2)在AsyncTask里面传入Activity,然后传入 new progressDialog(Context context),当Activity finish()之后AsyncTask showDidlog时就会出现内存泄露问题,

   导致finish失败;

   3)在Acitivity里面传入Acitivity.this 给dialog,在finish之后没有dismiss Dialog,这样也会导致Activity释放不了

    那我们怎么选择传入怎样的context呢?怎么解决这个问题呢?

    我们经常使用到两种context:

    A)Activity.this  周期为当前Acitivity生命周期;

    B)getApplicationContext() 周期为整个应用生命周期;  

    第一种情况是因为传入的Activity被static的类所引用,不管里面有没有界面显示,传入的Activity都释放不了,解决的办法就是传入getApplicationContext() ,类似

    的如果不需要Activity来显示界面或者做只有Activity才能做的事情,那只需要传入getApplicationContext() 就能满足要求。

   第二种情况是由于dialog是异步线程里面显示的,但它的界面显示却依赖于传入的Activity,所以Activity在调用finish时不会完全结束,无法释放,解决办法是通过在

  Activity里面初始化AsyncTask时传入接口,然后使用回调的方式调用Activity里面的界面显示方法,当然,调用的时候需要判断组件是否被被设为null或者是否初始化。

   第三种情况,就是在当前界面传入Activity.this给Dialog,在finish时没有调用dialog的dismiss(),这样也会导致Activity释放不了。所以在finish()里面要做一些

   致空的操作。

   以上在平时都是比较细节用法,可能对整个程序不会照成太大影响,但一个好的产品来源于对于细节的极致要求,细节决定成败!

   

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 塑料水管与水阀连接处漏水怎么办 介质流向标识管道温度太高怎么办 雪碧里气体太多瓶子涨得要炸怎么办 餐厅不清洗油烟管道物业该怎么办 用完权健洁净宝后奇痒的厉害怎么办 老房子铸铁暖气管从外锈蚀了怎么办 德意壁挂炉补水多了水压过高怎么办 新空调的散热片铜管漏了怎么办 猪舍被别人推掉漏电电到人怎么办? 网上买的燃气灶连接用软管怎么办 哈弗h3后减振器上支架坏了怎么办 汽车用收录机电机皮带断了怎么办 大便太粗把马桶堵了怎么办 大便过粗把马桶堵了怎么办 大便硬的像石头拉不出来怎么办 家里埋在地下的水管漏水怎么办 埋在墙里的水管漏水怎么办 开发商暗埋水管热熔接头漏水怎么办 钻墙把水管钻破了怎么办 钻墙时不小心把水管钻破了怎么办 孩子把同桌的铅笔盒弄坏了怎么办 水管伐坏了物业不给修怎么办 卫生间埋在地下的水管漏水怎么办 埋在地下的水管冻住了怎么办 洗脸盆下水管有眉笔掉堵了怎么办 楼上打空调眼导致墙面潮湿怎么办 阳台做防水了又贴砖还漏水怎么办 洗菜盆里的盖子吸住拔不起来怎么办 掉小区阴井盖里物业不管怎么办 卫生间下水道被头发堵了怎么办妙招 久量时尚夜光台灯不亮了怎么办 我想做水电暖工程没有资质怎么办 修手机被弄丢了没有开维修单怎么办 手机去维修被老板弄丢了怎么办 5年保修期过后房子楼顶漏水怎么办 墙内水管漏水怎么办3步骤巧维修 下面有地暖下面水管漏水怎么办 热水器接的塑料水管子漏水怎么办 电热水器烧热水时热水管漏水怎么办 户户通位置锁定模块异常1怎么办 户户通位置锁定模块异常3怎么办