Android开发中使用Handler类造成的内存泄露问题

在Android开发中,经常使用Handler来进行主线程(UI线程)与子线程间的消息传递工作,代码如下:

public class MyActivity extends Activity
{

        Handler mHandler = new Handler()
	{

		@Override
		public void handleMessage(Messagemsg)
                {
                    super.handleMessage(msg);

		{
		
	};


}

但这么做编译器会报一个警告:This Handler class should be static or leaks might occur 

意思是Handler应该创建成静态的,并且使用弱引用,否则可能造成内存泄露。这是由于非静态内部类会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。
解决办法是将Handler声明为static嵌套类,并且使用对外部类的弱引用。在此,顺便说一下什么是弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用常用来解决内存泄露问题。
代码如下:
static class MyHandler extends Handler 
{
                WeakReference<MyActivity> mActivity;
   
                MyHandler(MyActivity activity) 
                {
                        mActivity = new WeakReference<MyActivity>(activity);
                }
   
                @Override
                public void handleMessage(Message msg) {
                        MyActivity activity = mActivity.get();
                        switch (msg.what) {
                        case 0:
                               
                                break;
                        }
                }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值