2011-04-05 104 views
2

因此,在我的Android应用程序的“家庭”活动中,我有一个非deamon线程,它在后台每隔30分钟检查一次博客的新帖以启动通知。当我为了测试目的而让线程睡眠几秒钟以确保它确实在后台工作时,它正常工作,但在实际的电话中,当事件应该在半小时后触发时,它不会正常工作“T。所以我的问题是,当我做* Thread.sleep(30_MINUTES)*的android系统杀死它或一些非活动的线程太久了? android会干掉睡眠线程吗?Android系统如何处理睡眠时间过长的线程?

回答

2

你为什么不试试AlarmManager每隔30分钟开启一次轮询代码?如果在接下来的30分钟内轮询完成,重新计划。 AlarmManager比让线程休眠更可靠

0

我不知道你在做什么编码,但绝对android系统不会自己杀死一个线程是否困或不重要。

0

这段时间究竟发生了什么?我相信,只有当你描述的内容(使用你描述的技术)能够可靠工作的唯一情况是,如果(a)你的活动(或者在同一过程中运行的另一个活动或服务)是整个前台活动(b)有一个阻止CPU睡眠的唤醒锁。

Android可能不会杀死单独的线程,但它绝对可以并且会根据process lifecycle杀死进程。

+0

好,并触发如果在XML中出现新的“项目”,则通知。即使主要活动不在前台,线程也会继续工作,但当整个应用程序被终止时(这是我的预期和想要的),它会停止工作,我已经通过将延迟设置为秒来确认这一点,关闭活动并甚至锁定手机,即使这样,线程仍在后台工作。 – AxiomaticNexus 2011-04-05 05:57:55

2

好的,问题解决了。导致这个问题的原因是,在Android中,当您将线程设置为睡眠状态,例如30分钟时,当设备进入睡眠状态(手机处于非活动状态后屏幕关闭)时,CPU进入所谓的“深度睡眠状态“这会导致线程的计数器 - 唤醒线程唤醒 - 在屏幕关闭时暂停。这意味着,例如,当您说Thread.sleep(500000)时,那些500000毫秒仅在手机唤醒时计数。解决方案是使用AlarmManager和BroadcastReceiver定期运行代码。

下面是关于如何使用广播接收器使用AlarmManager一个简单的指南:在此期间,该线程只是检索从RSS源,并检查新项目与存储以前版本的内容http://justcallmebrian.com/?p=129