运行很多次我的应用后,我遇到内存问题。
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
}
}
telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);
mPhoneListener = null;
答案 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;
}
}