Handler造成的内存泄漏

来看下面代码,会引起内存泄漏

public class HandlerActivity extends Activity {
	//可能引起内存泄漏
	private final Handler mHandler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			//...
		}
	}
}

Handler 是和 Looper 以及 MessageQueue 一起工作的,在 Android 中,一个应用启动后,系统默认会创建一个为主线程

服务的Looper对象,该Looper 对象用于处理主线程的所有 Message 对象,它的生命周期贯穿于整个应用的生命周期。

主线程中使用的 Handler 都会默认绑定到这个 Looper 对象。在主线程中创建 Handler 对象时,它会立即关联主线程Looper

对象的 MessageQueue,这时发送到 MessageQueue 中的 Message 对象都会持有这个 Handler 对象的引用,这样在 

Looper 处理消息时才能回调到 Handler 的 handleMessage 方法。因此,如果 Message 还没有被处理完成,那么Handler

对象也就不会被垃圾回收。上面的代码中,将 Handler 的实例声明为 HandlerActivity类的内部类。

而在 java 语言中,非静态类内部匿名类持有外部类的一个隐式的引用,这样就可能导致外部类无法被垃圾回收。

因此最终由于 MessageQueue 中的 Message 还没有处理完成,就会持有Handler 对象的引用,而 非静态的 Handler 

对象会持有外部类 HandlerActivity 的引用,这个 Activity 无法被垃圾回收,从而导致内存泄漏。

解决办法:

1°  在子线程中使用 Handler,这时需要自己创建一个 Looper 对象,这个 Looper对象的生命周期同一般的java对象,因此

用这种用法没问题。

2° 将Handler 声明为 静态的内部类,前面说过,静态内部类 不会持有外部类的引用,因此也不会引起内存泄漏。

猜你喜欢

转载自blog.csdn.net/dummyo/article/details/80068736