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)
小智 6
上面的答案是不正确的:onDestroy()在这里不是问题,因为杀死进程显然会释放所有内存和绑定器.
这里有一个非常重要的因素需要考虑.只有在系统进程中的关联绑定程序对象被释放后,才会释放向电话管理器注册的绑定程序.在正确取消注册侦听器之后,这可能会很长,因为在系统进程中下一次GC运行之前可能需要一些时间来回收对象并使用对侦听器的引用.
您可以做的最好的事情是在onDestroy()中完成它后,从侦听器手动删除对其他对象的引用.