Activity中使用handle存在内存泄漏的隐患


      在Android开发中,经常会在Activity中使用handler来进行线程间通信,使主线程能够实时更新UI。


      但是在Android Studio中,发现使用handler时会有黄色的警告提示。提示语为this Handler class should be static or leaks might occur。这条提示的内容就是说:使用handler可能会发生内存泄漏,建议改成静态的。那么为什么Activity中使用handle存在内存泄漏的隐患呢?


      因为同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,由于java在生成内部类的时候,原本没有构造器的内部类会被生成一个带外部类参数的构造器,这个内部类就会持有外部类的隐式引用。Handler其实隐式的持有了Activity的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。


      在java里,非静态内部类和匿名类都会潜在的引用它们所属的外部类。但是,静态内部类却不会。因此将handler改成静态的就可以有效的避免对Activity的隐式引用,从而避免内存泄漏。


      另外,如果想要在handler内部去调用所在的外部类Activity,那么可以在handler内部使用弱引用的方式指向所在Activity,这样同样不会导致内存泄漏。

private static class MyHandler extends Handler {  
        WeakReference<MainActivity> mActivity;  
          
        MyHandler(MainActivity mActivity){  
            this.mActivity = new WeakReference<MainActivity>(mActivity);  
        }  
          
        @Override  
        public void handleMessage(Message msg) {  
          //TODO
        }  
    }  

      由于内部静态类又不能直接地用activity中的成员变量,在这种情况下,可以使用弱引用。这是因为当Activity被销毁时,系统解除了对该Activity的强引用,gc可以回收掉。但是handle对Activity的强引用如果没有解除,就会造成activity不能被回收,使用若引用就不会造成这种情况。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值