PhoneStateListener内存泄漏 - android

Dan*_*ykt 1 memory android 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); 
Run Code Online (Sandbox Code Playgroud)

在Activity类上:

PhoneStateListener mPhoneListener = new PhoneStateListener() {
        public void onCallStateChanged(int state,
                java.lang.String incomingNumber) {
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

on onDestroy方法:

telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);        
mPhoneListener = null;
Run Code Online (Sandbox Code Playgroud)

Don*_*ker 6

onDestroy不能保证被调用.来源:onDestroy Docs

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


小智 6

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

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

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