我有一个也是LocationListener的服务。在新的位置事件时,它会执行一些需要时间的网络资源;这就是为什么它被实现为AsyncTask。
我经常在登录真实设备时看到:
03-29 17:02:20.847 D/dalvikvm( 235): GC_FOR_ALLOC freed 961K, 29% free 10234K/14215K, paused 26ms
03-29 17:02:20.855 I/DemoService( 555): DiyScheduer.onStart
03-29 17:02:20.855 I/ggheart ( 555): onStart
03-29 17:02:21.097 V/PhoneStatusBar( 235): setLightsOn(true)
03-29 17:02:21.121 W/IInputConnectionWrapper(11244): showStatusIcon on inactive InputConnection
03-29 17:02:21.277 I/ActivityManager( 161): Process android.process.media (pid 11298) has died.
03-29 17:02:22.058 I/ActivityManager( 161): Process com.idavydov.myapp (pid 11051) has died.
03-29 17:02:22.066 I/WindowManager( 161): WIN DEATH: Window{41b05850 com.idavydov.myapp/com.idavydov.myapp.MyActivity paused=false}
03-29 17:02:22.074 W/ActivityManager( 161): Scheduling restart of crashed service com.idavydov.myapp/.MyService in 5000ms
通常在加载一些大型应用程序后会发生。
这种记忆力低的原因是什么?在那种情况下,为什么日志中没有这种消息?
P.S。在另一个问题中,我看到解释的原因是任务需要花费太多时间。但我已将下面的代码添加到我的AsyncTask中,无法在模拟器中重现崩溃。
protected Boolean doInBackground(...) {
...
long time = System.currentTimeMillis();
while (System.currentTimeMillis() - time < 11 * 1000);
....
}
由于
答案 0 :(得分:1)
我认为你混合了两件事。 Android不允许阻止UI线程,如果是这样,它会杀死你的应用程序。除非你把阻塞处理和循环放到AsyncTask的后台进程中。
除此之外,当内存不足或者识别出你的应用对用户没有影响时,android会在没有任何警告的情况下终止你的应用。 如果您希望自己的应用停留更长时间,则需要一个粘性服务和良好的应用生命周期管理。