我有一个在后台运行的位置服务,并使用位置管理器每隔30秒向我的服务器发送lat和long值。我希望此服务无限长时间运行,直到用户停止服务。但我观察到的是几个小时后,服务消失了,因为它超过30多万桶。我想知道如果用户没有停止它,我怎么能让它运行?
我的观察很少(如果我错了,请纠正我): 在分配跟踪器中,占用内存的大多数对象是位置管理器对象。 在堆中,当我导致gc时,我的对象分配的内存消失了,所以我猜没有内存泄漏。 在应用程序 - >运行服务中,我看不到任何服务运行4个多小时。那么我想要做的是不可能的?
非常感谢任何帮助/建议。
提前致谢。
答案 0 :(得分:4)
我不确定为什么你的服务开始占用超过30兆字节,但你可能会以某种方式泄漏内存。
最后,你的设计是有缺陷的。你能做的最好的事情是:
答案 1 :(得分:1)
我有一个在后台运行的位置服务,并使用位置管理器每隔30秒向我的服务器发送lat和long值。
请允许用户选择轮询期,包括“从不轮询”。
另外,请注意这会严重影响用户的电池。
我希望这项服务能够无限期地运行,直到用户停止服务为止。
这是不可能的。您最接近的是通过startForeground()
,但即使这样也不能保证您的服务永远存在。
此外,这是Android中严重的反模式。用户讨厌试图永远运行的应用程序,这就是为什么我们必须与任务杀手等竞争。
但我观察到的是几个小时之后,服务消失了,因为它超过30多万桶。
在保持GPS开启并且设备始终处于唤醒状态的几个小时内,您的用户的电池将耗尽,此时您的服务和其他一切都将消失。
关于记忆,如果你认为你正在泄漏记忆,请使用MAT来追踪泄漏。
答案 2 :(得分:0)
为什么不以编程方式发出gc - 比如每小时说一次?
我不知道你想做什么是不可能的。我想毕竟应该是可能的。 让我想知道的是:为什么VM没有启动gc而反而崩溃?
可能存在内存泄漏问题?
Avoiding memory leaks - blogentry可能会提供一些提示。
如果你给我们一些你的代码,或许有人可以给你更复杂的建议吗?