如何处理handler对activity的持有

真是百闻不如一见啊,来到了新地方,才能阅读到不同的代码,学到不同的东西。


当我们的activity里有handler对象时,有时候会因为handler对activity的持有而导致activity无法被回收,引发oom。

这时我们有三种方法可以处理:

1,弱引用,根据java的gc机制,弱引用不会影响系统对该对象的回收。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class MyHandler extends Handler{  
  2.         WeakReference<Activity> mActivity;  
  3.         public MyHandler(<span style="font-family: Arial, Helvetica, sans-serif;">Activity</span><span style="font-family: Arial, Helvetica, sans-serif;"> con){</span>  
  4.             this.mActivity = new WeakReference<<span style="font-family: Arial, Helvetica, sans-serif;">Activity</span>>(con);  
  5.         }  
  6.           
  7.         public void handleMessage(android.os.Message msg) {  
  8.             if(msg.what == 1 ){  
  9.                 Toast.makeText(Activity.this"toast"1000).show();  
  10.                 send();  
  11.             }  
  12.               
  13.         };  
  14.     }  

2.将Handler声明为静态类。

静态类不持有外部类的对象,所以你的Activity可以随意被回收

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static class MyHandler extends Handler{   
  2.         public void handleMessage(android.os.Message msg) {  
  3.             if(msg.what == 1 ){  
  4.                 Toast.makeText(HandlerNull.this"toast"1000).show();  
  5.                 send();  
  6.             }  
  7.               
  8.         };  
  9.     }  

3.通过程序逻辑去除引用handler的业务。

如在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。2如果你的Handler是被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列移除就行了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值