PhoneStateListener内存泄漏 - android

时间:2009-12-22 19:50:19

标签: android memory phone-state-listener

运行很多次我的应用后,我遇到内存问题。

java.lang.OutOfMemoryError:位图大小超过VM预算

我认为我在某种程度上泄漏了内存所以我做了一个DUMP HPROF文件并使用MAT工具找出错误。 事实证明,在运行5次app并退出之后,我发现了5个Activity的实例和5个PhoneStateListener实例。

如果我删除对PhoneStateListener的调用,我就不再有这个问题了,我只看到了一个我的Activity实例。

问题是,我该如何解决这个问题?

由于

丹尼尔


这是我的代码:

OnCreate方法:

telephonyManager.listen(mPhoneListener,
                PhoneStateListener.LISTEN_SERVICE_STATE
                | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
                | PhoneStateListener.LISTEN_CALL_STATE
                | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
                | PhoneStateListener.LISTEN_DATA_ACTIVITY); 

在Activity类上:

PhoneStateListener mPhoneListener = new PhoneStateListener() {
        public void onCallStateChanged(int state,
                java.lang.String incomingNumber) {
        //do something
    }
}
on onDestroy方法:

telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);        
mPhoneListener = null;

3 个答案:

答案 0 :(得分:6)

onDestroy不保证被调用。资料来源:onDestroy Docs

你应该尝试清理onPause,然后onResume重新启动你需要的东西。这有助于清理一些内存压力和泄漏。

答案 1 :(得分:6)

上面的答案是不正确的:onDestroy()在这里不是问题,因为杀死进程显然会释放所有内存和绑定器。

这里有一个非常重要的因素需要考虑。只有在系统进程中的关联绑定程序对象被释放后,才会释放向电话管理器注册的绑定程序。在正确取消注册侦听器之后,这可能会很长,因为在系统进程中的下一次GC运行之前可能需要一些时间来回收对象以及对侦听器的引用。

您可以做的最好的事情是在onDestroy()中完成它后,从侦听器手动删除对其他对象的引用。

答案 2 :(得分:-1)

PhoneStateListener mPhoneListener = new PhoneStateListener() 
{ 
    public void onCallStateChanged(int state, java.lang.String incomingNumber) 
    { 
    //do something 

     telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE); 
     mPhoneListener = null;
    } 
}