理论教育 避免未释放对象引用:如何避免4.4.3问题?

避免未释放对象引用:如何避免4.4.3问题?

时间:2023-06-19 理论教育 版权反馈
【摘要】:对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。但是如果在释放LockScreen对象时,忘记取消之前注册的PhoneStateListener对象,则会导致LockScreen无法被回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process进程挂掉。

避免未释放对象引用:如何避免4.4.3问题?

这种情况描述起来比较麻烦,为了说明问题,举两个演示进行说明。

(1)演示一

假设有如下操作:

在上述代码中有一个成员变量obj,在operation()中我们希望能够将处理obj实例的操作post到某个线程的MessageQueue中。在上述代码中,即便mHandler所在的线程使用完了obj所引用的对象,但这个对象仍然不会被垃圾回收掉,因为DemoActivity.obj还保有这个对象的引用。所以如果在DemoActivity中不再使用这个对象了,可以在“[Mark]”的位置释放对象的引用,代码可以修改为:

(2)演示二(www.daowen.com)

假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。

但是如果在释放LockScreen对象时,忘记取消之前注册的PhoneStateListener对象,则会导致LockScreen无法被回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory(内存不足),使得system_process进程挂掉。

由此可见,当一个生命周期较短的对象A,被一个生命周期较长的对象B保有其引用的情况下,在A的生命周期结束时,要及时在B中清除掉对A的引用。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈