android 使用handler内存泄露问题

本文深入解析了Android开发中使用Handler时容易出现的内存泄露问题,并详细解释了如何通过静态内部类来解决这一问题,确保资源的有效管理和避免不必要的内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android中使用handler时容易出现内存泄露,如下:

private Handler myHandler = new Handler(){

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


会看到eclipse会出现一个警告,点击警告处会看到如下的内容:


从警告的提示可以看出Handler的使用最好是使用静态的,或者会出现内存泄露问题。

了解一下Handler

  1. 当Android程序第一次创建的时候,在主线程同时会创建一个Looper对象。Looper实现了一个简单的消息队列,一个接着一个处理Message对象。程序框架所有主要的事件(例如:屏幕上的点击时间,Activity生命周期的方法等等)都包含在Message对象中,然后添加到Looper的消息队列中,一个一个处理。主线程的Looper存在整个应用程序的生命周期内。
  2. 当一个Handler对象在主线程中创建的时候,它会关联到Looper的 message queue 。Message添加到消息队列中的时候Message会持有当前Handler引用,当Looper处理到当前消息的时候,会调用Handler#handleMessage(Message).
  3. java中,no-static的内部类会 隐式的 持有当前类的一个引用。static的类则没有。

 private static Handler myHandler = new Handler();

但是这样的初始化Handler并不能用于处理Message,只能利用Handler的post方法,为了让Handler可以接收和处理消息,我们采用以下的方式:

static class MyHandler extends Handler{

    	WeakReference<ViewServerActivity> mActivity;
    	
    	public MyHandler(ViewServerActivity v){
    		mActivity = new WeakReference<ViewServerActivity>(v);
    	}
    	
		@Override
		public void handleMessage(Message msg) {
			ViewServerActivity view = mActivity.get();
			if(msg.what == 1){
				view.test();
			}
		}
	  
    }

使用静态的内部类,不会持有当前对象的引用,从而可以解决


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值